vips_operation_math_get_type:
   13|      1|{
   14|      1|	static gsize gtype_id = 0;
   15|       |
   16|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
   17|      1|		static const GEnumValue values[] = {
   18|      1|			{ VIPS_OPERATION_MATH_SIN, "VIPS_OPERATION_MATH_SIN", "sin" },
   19|      1|			{ VIPS_OPERATION_MATH_COS, "VIPS_OPERATION_MATH_COS", "cos" },
   20|      1|			{ VIPS_OPERATION_MATH_TAN, "VIPS_OPERATION_MATH_TAN", "tan" },
   21|      1|			{ VIPS_OPERATION_MATH_ASIN, "VIPS_OPERATION_MATH_ASIN", "asin" },
   22|      1|			{ VIPS_OPERATION_MATH_ACOS, "VIPS_OPERATION_MATH_ACOS", "acos" },
   23|      1|			{ VIPS_OPERATION_MATH_ATAN, "VIPS_OPERATION_MATH_ATAN", "atan" },
   24|      1|			{ VIPS_OPERATION_MATH_LOG, "VIPS_OPERATION_MATH_LOG", "log" },
   25|      1|			{ VIPS_OPERATION_MATH_LOG10, "VIPS_OPERATION_MATH_LOG10", "log10" },
   26|      1|			{ VIPS_OPERATION_MATH_EXP, "VIPS_OPERATION_MATH_EXP", "exp" },
   27|      1|			{ VIPS_OPERATION_MATH_EXP10, "VIPS_OPERATION_MATH_EXP10", "exp10" },
   28|      1|			{ VIPS_OPERATION_MATH_SINH, "VIPS_OPERATION_MATH_SINH", "sinh" },
   29|      1|			{ VIPS_OPERATION_MATH_COSH, "VIPS_OPERATION_MATH_COSH", "cosh" },
   30|      1|			{ VIPS_OPERATION_MATH_TANH, "VIPS_OPERATION_MATH_TANH", "tanh" },
   31|      1|			{ VIPS_OPERATION_MATH_ASINH, "VIPS_OPERATION_MATH_ASINH", "asinh" },
   32|      1|			{ VIPS_OPERATION_MATH_ACOSH, "VIPS_OPERATION_MATH_ACOSH", "acosh" },
   33|      1|			{ VIPS_OPERATION_MATH_ATANH, "VIPS_OPERATION_MATH_ATANH", "atanh" },
   34|      1|			{ VIPS_OPERATION_MATH_LAST, "VIPS_OPERATION_MATH_LAST", "last" },
   35|      1|			{ 0, NULL, NULL }
   36|      1|		};
   37|       |
   38|      1|		GType new_type =
   39|      1|			g_enum_register_static(g_intern_static_string("VipsOperationMath"), values);
   40|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
   41|      1|	}
   42|       |
   43|      1|	return (GType) gtype_id;
   44|      1|}
vips_operation_math2_get_type:
   47|      2|{
   48|      2|	static gsize gtype_id = 0;
   49|       |
   50|      2|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 1]
  |  |  ------------------
  |  |  249|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      2|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      2|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      4|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      4|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      4|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      4|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      4|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      4|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      4|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 1]
  |  |  ------------------
  |  |  252|      2|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      2|  }))
  ------------------
   51|      1|		static const GEnumValue values[] = {
   52|      1|			{ VIPS_OPERATION_MATH2_POW, "VIPS_OPERATION_MATH2_POW", "pow" },
   53|      1|			{ VIPS_OPERATION_MATH2_WOP, "VIPS_OPERATION_MATH2_WOP", "wop" },
   54|      1|			{ VIPS_OPERATION_MATH2_ATAN2, "VIPS_OPERATION_MATH2_ATAN2", "atan2" },
   55|      1|			{ VIPS_OPERATION_MATH2_LAST, "VIPS_OPERATION_MATH2_LAST", "last" },
   56|      1|			{ 0, NULL, NULL }
   57|      1|		};
   58|       |
   59|      1|		GType new_type =
   60|      1|			g_enum_register_static(g_intern_static_string("VipsOperationMath2"), values);
   61|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
   62|      1|	}
   63|       |
   64|      2|	return (GType) gtype_id;
   65|      2|}
vips_operation_round_get_type:
   68|      1|{
   69|      1|	static gsize gtype_id = 0;
   70|       |
   71|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
   72|      1|		static const GEnumValue values[] = {
   73|      1|			{ VIPS_OPERATION_ROUND_RINT, "VIPS_OPERATION_ROUND_RINT", "rint" },
   74|      1|			{ VIPS_OPERATION_ROUND_CEIL, "VIPS_OPERATION_ROUND_CEIL", "ceil" },
   75|      1|			{ VIPS_OPERATION_ROUND_FLOOR, "VIPS_OPERATION_ROUND_FLOOR", "floor" },
   76|      1|			{ VIPS_OPERATION_ROUND_LAST, "VIPS_OPERATION_ROUND_LAST", "last" },
   77|      1|			{ 0, NULL, NULL }
   78|      1|		};
   79|       |
   80|      1|		GType new_type =
   81|      1|			g_enum_register_static(g_intern_static_string("VipsOperationRound"), values);
   82|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
   83|      1|	}
   84|       |
   85|      1|	return (GType) gtype_id;
   86|      1|}
vips_operation_relational_get_type:
   89|      2|{
   90|      2|	static gsize gtype_id = 0;
   91|       |
   92|      2|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 1]
  |  |  ------------------
  |  |  249|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      2|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      2|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      4|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      4|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      4|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      4|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      4|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      4|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      4|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 1]
  |  |  ------------------
  |  |  252|      2|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      2|  }))
  ------------------
   93|      1|		static const GEnumValue values[] = {
   94|      1|			{ VIPS_OPERATION_RELATIONAL_EQUAL, "VIPS_OPERATION_RELATIONAL_EQUAL", "equal" },
   95|      1|			{ VIPS_OPERATION_RELATIONAL_NOTEQ, "VIPS_OPERATION_RELATIONAL_NOTEQ", "noteq" },
   96|      1|			{ VIPS_OPERATION_RELATIONAL_LESS, "VIPS_OPERATION_RELATIONAL_LESS", "less" },
   97|      1|			{ VIPS_OPERATION_RELATIONAL_LESSEQ, "VIPS_OPERATION_RELATIONAL_LESSEQ", "lesseq" },
   98|      1|			{ VIPS_OPERATION_RELATIONAL_MORE, "VIPS_OPERATION_RELATIONAL_MORE", "more" },
   99|      1|			{ VIPS_OPERATION_RELATIONAL_MOREEQ, "VIPS_OPERATION_RELATIONAL_MOREEQ", "moreeq" },
  100|      1|			{ VIPS_OPERATION_RELATIONAL_LAST, "VIPS_OPERATION_RELATIONAL_LAST", "last" },
  101|      1|			{ 0, NULL, NULL }
  102|      1|		};
  103|       |
  104|      1|		GType new_type =
  105|      1|			g_enum_register_static(g_intern_static_string("VipsOperationRelational"), values);
  106|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  107|      1|	}
  108|       |
  109|      2|	return (GType) gtype_id;
  110|      2|}
vips_operation_boolean_get_type:
  113|      3|{
  114|      3|	static gsize gtype_id = 0;
  115|       |
  116|      3|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      3|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      3|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 2]
  |  |  ------------------
  |  |  249|      3|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      3|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      3|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      3|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      6|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      3|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      6|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      3|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      6|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      6|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      6|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      6|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      6|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 2]
  |  |  ------------------
  |  |  252|      3|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      3|  }))
  ------------------
  117|      1|		static const GEnumValue values[] = {
  118|      1|			{ VIPS_OPERATION_BOOLEAN_AND, "VIPS_OPERATION_BOOLEAN_AND", "and" },
  119|      1|			{ VIPS_OPERATION_BOOLEAN_OR, "VIPS_OPERATION_BOOLEAN_OR", "or" },
  120|      1|			{ VIPS_OPERATION_BOOLEAN_EOR, "VIPS_OPERATION_BOOLEAN_EOR", "eor" },
  121|      1|			{ VIPS_OPERATION_BOOLEAN_LSHIFT, "VIPS_OPERATION_BOOLEAN_LSHIFT", "lshift" },
  122|      1|			{ VIPS_OPERATION_BOOLEAN_RSHIFT, "VIPS_OPERATION_BOOLEAN_RSHIFT", "rshift" },
  123|      1|			{ VIPS_OPERATION_BOOLEAN_LAST, "VIPS_OPERATION_BOOLEAN_LAST", "last" },
  124|      1|			{ 0, NULL, NULL }
  125|      1|		};
  126|       |
  127|      1|		GType new_type =
  128|      1|			g_enum_register_static(g_intern_static_string("VipsOperationBoolean"), values);
  129|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  130|      1|	}
  131|       |
  132|      3|	return (GType) gtype_id;
  133|      3|}
vips_operation_complex_get_type:
  136|      1|{
  137|      1|	static gsize gtype_id = 0;
  138|       |
  139|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  140|      1|		static const GEnumValue values[] = {
  141|      1|			{ VIPS_OPERATION_COMPLEX_POLAR, "VIPS_OPERATION_COMPLEX_POLAR", "polar" },
  142|      1|			{ VIPS_OPERATION_COMPLEX_RECT, "VIPS_OPERATION_COMPLEX_RECT", "rect" },
  143|      1|			{ VIPS_OPERATION_COMPLEX_CONJ, "VIPS_OPERATION_COMPLEX_CONJ", "conj" },
  144|      1|			{ VIPS_OPERATION_COMPLEX_LAST, "VIPS_OPERATION_COMPLEX_LAST", "last" },
  145|      1|			{ 0, NULL, NULL }
  146|      1|		};
  147|       |
  148|      1|		GType new_type =
  149|      1|			g_enum_register_static(g_intern_static_string("VipsOperationComplex"), values);
  150|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  151|      1|	}
  152|       |
  153|      1|	return (GType) gtype_id;
  154|      1|}
vips_operation_complex2_get_type:
  157|      1|{
  158|      1|	static gsize gtype_id = 0;
  159|       |
  160|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  161|      1|		static const GEnumValue values[] = {
  162|      1|			{ VIPS_OPERATION_COMPLEX2_CROSS_PHASE, "VIPS_OPERATION_COMPLEX2_CROSS_PHASE", "cross-phase" },
  163|      1|			{ VIPS_OPERATION_COMPLEX2_LAST, "VIPS_OPERATION_COMPLEX2_LAST", "last" },
  164|      1|			{ 0, NULL, NULL }
  165|      1|		};
  166|       |
  167|      1|		GType new_type =
  168|      1|			g_enum_register_static(g_intern_static_string("VipsOperationComplex2"), values);
  169|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  170|      1|	}
  171|       |
  172|      1|	return (GType) gtype_id;
  173|      1|}
vips_operation_complexget_get_type:
  176|      1|{
  177|      1|	static gsize gtype_id = 0;
  178|       |
  179|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  180|      1|		static const GEnumValue values[] = {
  181|      1|			{ VIPS_OPERATION_COMPLEXGET_REAL, "VIPS_OPERATION_COMPLEXGET_REAL", "real" },
  182|      1|			{ VIPS_OPERATION_COMPLEXGET_IMAG, "VIPS_OPERATION_COMPLEXGET_IMAG", "imag" },
  183|      1|			{ VIPS_OPERATION_COMPLEXGET_LAST, "VIPS_OPERATION_COMPLEXGET_LAST", "last" },
  184|      1|			{ 0, NULL, NULL }
  185|      1|		};
  186|       |
  187|      1|		GType new_type =
  188|      1|			g_enum_register_static(g_intern_static_string("VipsOperationComplexget"), values);
  189|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  190|      1|	}
  191|       |
  192|      1|	return (GType) gtype_id;
  193|      1|}
vips_precision_get_type:
  197|      7|{
  198|      7|	static gsize gtype_id = 0;
  199|       |
  200|      7|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      7|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      7|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 6]
  |  |  ------------------
  |  |  249|      7|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      7|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      7|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      7|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|     14|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      7|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|     14|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      7|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|     14|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|     14|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|     14|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|     14|    gapg_temp_newval;                                                        \
  |  |  |  |  131|     14|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 6]
  |  |  ------------------
  |  |  252|      7|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      7|  }))
  ------------------
  201|      1|		static const GEnumValue values[] = {
  202|      1|			{ VIPS_PRECISION_INTEGER, "VIPS_PRECISION_INTEGER", "integer" },
  203|      1|			{ VIPS_PRECISION_FLOAT, "VIPS_PRECISION_FLOAT", "float" },
  204|      1|			{ VIPS_PRECISION_APPROXIMATE, "VIPS_PRECISION_APPROXIMATE", "approximate" },
  205|      1|			{ VIPS_PRECISION_LAST, "VIPS_PRECISION_LAST", "last" },
  206|      1|			{ 0, NULL, NULL }
  207|      1|		};
  208|       |
  209|      1|		GType new_type =
  210|      1|			g_enum_register_static(g_intern_static_string("VipsPrecision"), values);
  211|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  212|      1|	}
  213|       |
  214|      7|	return (GType) gtype_id;
  215|      7|}
vips_intent_get_type:
  219|      2|{
  220|      2|	static gsize gtype_id = 0;
  221|       |
  222|      2|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 1]
  |  |  ------------------
  |  |  249|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      2|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      2|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      4|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      4|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      4|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      4|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      4|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      4|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      4|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 1]
  |  |  ------------------
  |  |  252|      2|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      2|  }))
  ------------------
  223|      1|		static const GEnumValue values[] = {
  224|      1|			{ VIPS_INTENT_PERCEPTUAL, "VIPS_INTENT_PERCEPTUAL", "perceptual" },
  225|      1|			{ VIPS_INTENT_RELATIVE, "VIPS_INTENT_RELATIVE", "relative" },
  226|      1|			{ VIPS_INTENT_SATURATION, "VIPS_INTENT_SATURATION", "saturation" },
  227|      1|			{ VIPS_INTENT_ABSOLUTE, "VIPS_INTENT_ABSOLUTE", "absolute" },
  228|      1|			{ VIPS_INTENT_LAST, "VIPS_INTENT_LAST", "last" },
  229|      1|			{ 0, NULL, NULL }
  230|      1|		};
  231|       |
  232|      1|		GType new_type =
  233|      1|			g_enum_register_static(g_intern_static_string("VipsIntent"), values);
  234|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  235|      1|	}
  236|       |
  237|      2|	return (GType) gtype_id;
  238|      2|}
vips_pcs_get_type:
  241|      1|{
  242|      1|	static gsize gtype_id = 0;
  243|       |
  244|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  245|      1|		static const GEnumValue values[] = {
  246|      1|			{ VIPS_PCS_LAB, "VIPS_PCS_LAB", "lab" },
  247|      1|			{ VIPS_PCS_XYZ, "VIPS_PCS_XYZ", "xyz" },
  248|      1|			{ VIPS_PCS_LAST, "VIPS_PCS_LAST", "last" },
  249|      1|			{ 0, NULL, NULL }
  250|      1|		};
  251|       |
  252|      1|		GType new_type =
  253|      1|			g_enum_register_static(g_intern_static_string("VipsPCS"), values);
  254|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  255|      1|	}
  256|       |
  257|      1|	return (GType) gtype_id;
  258|      1|}
vips_extend_get_type:
  262|      3|{
  263|      3|	static gsize gtype_id = 0;
  264|       |
  265|      3|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      3|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      3|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 2]
  |  |  ------------------
  |  |  249|      3|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      3|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      3|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      3|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      6|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      3|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      6|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      3|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      6|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      6|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      6|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      6|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      6|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 2]
  |  |  ------------------
  |  |  252|      3|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      3|  }))
  ------------------
  266|      1|		static const GEnumValue values[] = {
  267|      1|			{ VIPS_EXTEND_BLACK, "VIPS_EXTEND_BLACK", "black" },
  268|      1|			{ VIPS_EXTEND_COPY, "VIPS_EXTEND_COPY", "copy" },
  269|      1|			{ VIPS_EXTEND_REPEAT, "VIPS_EXTEND_REPEAT", "repeat" },
  270|      1|			{ VIPS_EXTEND_MIRROR, "VIPS_EXTEND_MIRROR", "mirror" },
  271|      1|			{ VIPS_EXTEND_WHITE, "VIPS_EXTEND_WHITE", "white" },
  272|      1|			{ VIPS_EXTEND_BACKGROUND, "VIPS_EXTEND_BACKGROUND", "background" },
  273|      1|			{ VIPS_EXTEND_LAST, "VIPS_EXTEND_LAST", "last" },
  274|      1|			{ 0, NULL, NULL }
  275|      1|		};
  276|       |
  277|      1|		GType new_type =
  278|      1|			g_enum_register_static(g_intern_static_string("VipsExtend"), values);
  279|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  280|      1|	}
  281|       |
  282|      3|	return (GType) gtype_id;
  283|      3|}
vips_compass_direction_get_type:
  286|      1|{
  287|      1|	static gsize gtype_id = 0;
  288|       |
  289|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  290|      1|		static const GEnumValue values[] = {
  291|      1|			{ VIPS_COMPASS_DIRECTION_CENTRE, "VIPS_COMPASS_DIRECTION_CENTRE", "centre" },
  292|      1|			{ VIPS_COMPASS_DIRECTION_NORTH, "VIPS_COMPASS_DIRECTION_NORTH", "north" },
  293|      1|			{ VIPS_COMPASS_DIRECTION_EAST, "VIPS_COMPASS_DIRECTION_EAST", "east" },
  294|      1|			{ VIPS_COMPASS_DIRECTION_SOUTH, "VIPS_COMPASS_DIRECTION_SOUTH", "south" },
  295|      1|			{ VIPS_COMPASS_DIRECTION_WEST, "VIPS_COMPASS_DIRECTION_WEST", "west" },
  296|      1|			{ VIPS_COMPASS_DIRECTION_NORTH_EAST, "VIPS_COMPASS_DIRECTION_NORTH_EAST", "north-east" },
  297|      1|			{ VIPS_COMPASS_DIRECTION_SOUTH_EAST, "VIPS_COMPASS_DIRECTION_SOUTH_EAST", "south-east" },
  298|      1|			{ VIPS_COMPASS_DIRECTION_SOUTH_WEST, "VIPS_COMPASS_DIRECTION_SOUTH_WEST", "south-west" },
  299|      1|			{ VIPS_COMPASS_DIRECTION_NORTH_WEST, "VIPS_COMPASS_DIRECTION_NORTH_WEST", "north-west" },
  300|      1|			{ VIPS_COMPASS_DIRECTION_LAST, "VIPS_COMPASS_DIRECTION_LAST", "last" },
  301|      1|			{ 0, NULL, NULL }
  302|      1|		};
  303|       |
  304|      1|		GType new_type =
  305|      1|			g_enum_register_static(g_intern_static_string("VipsCompassDirection"), values);
  306|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  307|      1|	}
  308|       |
  309|      1|	return (GType) gtype_id;
  310|      1|}
vips_direction_get_type:
  313|      6|{
  314|      6|	static gsize gtype_id = 0;
  315|       |
  316|      6|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      6|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      6|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 5]
  |  |  ------------------
  |  |  249|      6|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      6|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      6|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      6|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|     12|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      6|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|     12|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      6|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|     12|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|     12|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|     12|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|     12|    gapg_temp_newval;                                                        \
  |  |  |  |  131|     12|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 5]
  |  |  ------------------
  |  |  252|      6|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      6|  }))
  ------------------
  317|      1|		static const GEnumValue values[] = {
  318|      1|			{ VIPS_DIRECTION_HORIZONTAL, "VIPS_DIRECTION_HORIZONTAL", "horizontal" },
  319|      1|			{ VIPS_DIRECTION_VERTICAL, "VIPS_DIRECTION_VERTICAL", "vertical" },
  320|      1|			{ VIPS_DIRECTION_LAST, "VIPS_DIRECTION_LAST", "last" },
  321|      1|			{ 0, NULL, NULL }
  322|      1|		};
  323|       |
  324|      1|		GType new_type =
  325|      1|			g_enum_register_static(g_intern_static_string("VipsDirection"), values);
  326|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  327|      1|	}
  328|       |
  329|      6|	return (GType) gtype_id;
  330|      6|}
vips_align_get_type:
  333|      2|{
  334|      2|	static gsize gtype_id = 0;
  335|       |
  336|      2|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 1]
  |  |  ------------------
  |  |  249|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      2|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      2|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      4|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      4|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      4|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      4|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      4|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      4|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      4|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 1]
  |  |  ------------------
  |  |  252|      2|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      2|  }))
  ------------------
  337|      1|		static const GEnumValue values[] = {
  338|      1|			{ VIPS_ALIGN_LOW, "VIPS_ALIGN_LOW", "low" },
  339|      1|			{ VIPS_ALIGN_CENTRE, "VIPS_ALIGN_CENTRE", "centre" },
  340|      1|			{ VIPS_ALIGN_HIGH, "VIPS_ALIGN_HIGH", "high" },
  341|      1|			{ VIPS_ALIGN_LAST, "VIPS_ALIGN_LAST", "last" },
  342|      1|			{ 0, NULL, NULL }
  343|      1|		};
  344|       |
  345|      1|		GType new_type =
  346|      1|			g_enum_register_static(g_intern_static_string("VipsAlign"), values);
  347|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  348|      1|	}
  349|       |
  350|      2|	return (GType) gtype_id;
  351|      2|}
vips_angle_get_type:
  354|      2|{
  355|      2|	static gsize gtype_id = 0;
  356|       |
  357|      2|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 1]
  |  |  ------------------
  |  |  249|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      2|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      2|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      4|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      4|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      4|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      4|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      4|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      4|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      4|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 1]
  |  |  ------------------
  |  |  252|      2|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      2|  }))
  ------------------
  358|      1|		static const GEnumValue values[] = {
  359|      1|			{ VIPS_ANGLE_D0, "VIPS_ANGLE_D0", "d0" },
  360|      1|			{ VIPS_ANGLE_D90, "VIPS_ANGLE_D90", "d90" },
  361|      1|			{ VIPS_ANGLE_D180, "VIPS_ANGLE_D180", "d180" },
  362|      1|			{ VIPS_ANGLE_D270, "VIPS_ANGLE_D270", "d270" },
  363|      1|			{ VIPS_ANGLE_LAST, "VIPS_ANGLE_LAST", "last" },
  364|      1|			{ 0, NULL, NULL }
  365|      1|		};
  366|       |
  367|      1|		GType new_type =
  368|      1|			g_enum_register_static(g_intern_static_string("VipsAngle"), values);
  369|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  370|      1|	}
  371|       |
  372|      2|	return (GType) gtype_id;
  373|      2|}
vips_angle45_get_type:
  376|      2|{
  377|      2|	static gsize gtype_id = 0;
  378|       |
  379|      2|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 1]
  |  |  ------------------
  |  |  249|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      2|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      2|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      4|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      4|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      4|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      4|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      4|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      4|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      4|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 1]
  |  |  ------------------
  |  |  252|      2|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      2|  }))
  ------------------
  380|      1|		static const GEnumValue values[] = {
  381|      1|			{ VIPS_ANGLE45_D0, "VIPS_ANGLE45_D0", "d0" },
  382|      1|			{ VIPS_ANGLE45_D45, "VIPS_ANGLE45_D45", "d45" },
  383|      1|			{ VIPS_ANGLE45_D90, "VIPS_ANGLE45_D90", "d90" },
  384|      1|			{ VIPS_ANGLE45_D135, "VIPS_ANGLE45_D135", "d135" },
  385|      1|			{ VIPS_ANGLE45_D180, "VIPS_ANGLE45_D180", "d180" },
  386|      1|			{ VIPS_ANGLE45_D225, "VIPS_ANGLE45_D225", "d225" },
  387|      1|			{ VIPS_ANGLE45_D270, "VIPS_ANGLE45_D270", "d270" },
  388|      1|			{ VIPS_ANGLE45_D315, "VIPS_ANGLE45_D315", "d315" },
  389|      1|			{ VIPS_ANGLE45_LAST, "VIPS_ANGLE45_LAST", "last" },
  390|      1|			{ 0, NULL, NULL }
  391|      1|		};
  392|       |
  393|      1|		GType new_type =
  394|      1|			g_enum_register_static(g_intern_static_string("VipsAngle45"), values);
  395|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  396|      1|	}
  397|       |
  398|      2|	return (GType) gtype_id;
  399|      2|}
vips_interesting_get_type:
  402|      2|{
  403|      2|	static gsize gtype_id = 0;
  404|       |
  405|      2|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 1]
  |  |  ------------------
  |  |  249|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      2|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      2|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      4|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      4|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      4|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      4|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      4|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      4|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      4|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 1]
  |  |  ------------------
  |  |  252|      2|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      2|  }))
  ------------------
  406|      1|		static const GEnumValue values[] = {
  407|      1|			{ VIPS_INTERESTING_NONE, "VIPS_INTERESTING_NONE", "none" },
  408|      1|			{ VIPS_INTERESTING_CENTRE, "VIPS_INTERESTING_CENTRE", "centre" },
  409|      1|			{ VIPS_INTERESTING_ENTROPY, "VIPS_INTERESTING_ENTROPY", "entropy" },
  410|      1|			{ VIPS_INTERESTING_ATTENTION, "VIPS_INTERESTING_ATTENTION", "attention" },
  411|      1|			{ VIPS_INTERESTING_LOW, "VIPS_INTERESTING_LOW", "low" },
  412|      1|			{ VIPS_INTERESTING_HIGH, "VIPS_INTERESTING_HIGH", "high" },
  413|      1|			{ VIPS_INTERESTING_ALL, "VIPS_INTERESTING_ALL", "all" },
  414|      1|			{ VIPS_INTERESTING_LAST, "VIPS_INTERESTING_LAST", "last" },
  415|      1|			{ 0, NULL, NULL }
  416|      1|		};
  417|       |
  418|      1|		GType new_type =
  419|      1|			g_enum_register_static(g_intern_static_string("VipsInteresting"), values);
  420|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  421|      1|	}
  422|       |
  423|      2|	return (GType) gtype_id;
  424|      2|}
vips_blend_mode_get_type:
  427|      1|{
  428|      1|	static gsize gtype_id = 0;
  429|       |
  430|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  431|      1|		static const GEnumValue values[] = {
  432|      1|			{ VIPS_BLEND_MODE_CLEAR, "VIPS_BLEND_MODE_CLEAR", "clear" },
  433|      1|			{ VIPS_BLEND_MODE_SOURCE, "VIPS_BLEND_MODE_SOURCE", "source" },
  434|      1|			{ VIPS_BLEND_MODE_OVER, "VIPS_BLEND_MODE_OVER", "over" },
  435|      1|			{ VIPS_BLEND_MODE_IN, "VIPS_BLEND_MODE_IN", "in" },
  436|      1|			{ VIPS_BLEND_MODE_OUT, "VIPS_BLEND_MODE_OUT", "out" },
  437|      1|			{ VIPS_BLEND_MODE_ATOP, "VIPS_BLEND_MODE_ATOP", "atop" },
  438|      1|			{ VIPS_BLEND_MODE_DEST, "VIPS_BLEND_MODE_DEST", "dest" },
  439|      1|			{ VIPS_BLEND_MODE_DEST_OVER, "VIPS_BLEND_MODE_DEST_OVER", "dest-over" },
  440|      1|			{ VIPS_BLEND_MODE_DEST_IN, "VIPS_BLEND_MODE_DEST_IN", "dest-in" },
  441|      1|			{ VIPS_BLEND_MODE_DEST_OUT, "VIPS_BLEND_MODE_DEST_OUT", "dest-out" },
  442|      1|			{ VIPS_BLEND_MODE_DEST_ATOP, "VIPS_BLEND_MODE_DEST_ATOP", "dest-atop" },
  443|      1|			{ VIPS_BLEND_MODE_XOR, "VIPS_BLEND_MODE_XOR", "xor" },
  444|      1|			{ VIPS_BLEND_MODE_ADD, "VIPS_BLEND_MODE_ADD", "add" },
  445|      1|			{ VIPS_BLEND_MODE_SATURATE, "VIPS_BLEND_MODE_SATURATE", "saturate" },
  446|      1|			{ VIPS_BLEND_MODE_MULTIPLY, "VIPS_BLEND_MODE_MULTIPLY", "multiply" },
  447|      1|			{ VIPS_BLEND_MODE_SCREEN, "VIPS_BLEND_MODE_SCREEN", "screen" },
  448|      1|			{ VIPS_BLEND_MODE_OVERLAY, "VIPS_BLEND_MODE_OVERLAY", "overlay" },
  449|      1|			{ VIPS_BLEND_MODE_DARKEN, "VIPS_BLEND_MODE_DARKEN", "darken" },
  450|      1|			{ VIPS_BLEND_MODE_LIGHTEN, "VIPS_BLEND_MODE_LIGHTEN", "lighten" },
  451|      1|			{ VIPS_BLEND_MODE_COLOUR_DODGE, "VIPS_BLEND_MODE_COLOUR_DODGE", "colour-dodge" },
  452|      1|			{ VIPS_BLEND_MODE_COLOUR_BURN, "VIPS_BLEND_MODE_COLOUR_BURN", "colour-burn" },
  453|      1|			{ VIPS_BLEND_MODE_HARD_LIGHT, "VIPS_BLEND_MODE_HARD_LIGHT", "hard-light" },
  454|      1|			{ VIPS_BLEND_MODE_SOFT_LIGHT, "VIPS_BLEND_MODE_SOFT_LIGHT", "soft-light" },
  455|      1|			{ VIPS_BLEND_MODE_DIFFERENCE, "VIPS_BLEND_MODE_DIFFERENCE", "difference" },
  456|      1|			{ VIPS_BLEND_MODE_EXCLUSION, "VIPS_BLEND_MODE_EXCLUSION", "exclusion" },
  457|      1|			{ VIPS_BLEND_MODE_LAST, "VIPS_BLEND_MODE_LAST", "last" },
  458|      1|			{ 0, NULL, NULL }
  459|      1|		};
  460|       |
  461|      1|		GType new_type =
  462|      1|			g_enum_register_static(g_intern_static_string("VipsBlendMode"), values);
  463|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  464|      1|	}
  465|       |
  466|      1|	return (GType) gtype_id;
  467|      1|}
vips_combine_get_type:
  471|      2|{
  472|      2|	static gsize gtype_id = 0;
  473|       |
  474|      2|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 1]
  |  |  ------------------
  |  |  249|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      2|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      2|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      4|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      4|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      4|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      4|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      4|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      4|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      4|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 1]
  |  |  ------------------
  |  |  252|      2|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      2|  }))
  ------------------
  475|      1|		static const GEnumValue values[] = {
  476|      1|			{ VIPS_COMBINE_MAX, "VIPS_COMBINE_MAX", "max" },
  477|      1|			{ VIPS_COMBINE_SUM, "VIPS_COMBINE_SUM", "sum" },
  478|      1|			{ VIPS_COMBINE_MIN, "VIPS_COMBINE_MIN", "min" },
  479|      1|			{ VIPS_COMBINE_LAST, "VIPS_COMBINE_LAST", "last" },
  480|      1|			{ 0, NULL, NULL }
  481|      1|		};
  482|       |
  483|      1|		GType new_type =
  484|      1|			g_enum_register_static(g_intern_static_string("VipsCombine"), values);
  485|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  486|      1|	}
  487|       |
  488|      2|	return (GType) gtype_id;
  489|      2|}
vips_sdf_shape_get_type:
  515|      1|{
  516|      1|	static gsize gtype_id = 0;
  517|       |
  518|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  519|      1|		static const GEnumValue values[] = {
  520|      1|			{ VIPS_SDF_SHAPE_CIRCLE, "VIPS_SDF_SHAPE_CIRCLE", "circle" },
  521|      1|			{ VIPS_SDF_SHAPE_BOX, "VIPS_SDF_SHAPE_BOX", "box" },
  522|      1|			{ VIPS_SDF_SHAPE_ROUNDED_BOX, "VIPS_SDF_SHAPE_ROUNDED_BOX", "rounded-box" },
  523|      1|			{ VIPS_SDF_SHAPE_LINE, "VIPS_SDF_SHAPE_LINE", "line" },
  524|      1|			{ VIPS_SDF_SHAPE_LAST, "VIPS_SDF_SHAPE_LAST", "last" },
  525|      1|			{ 0, NULL, NULL }
  526|      1|		};
  527|       |
  528|      1|		GType new_type =
  529|      1|			g_enum_register_static(g_intern_static_string("VipsSdfShape"), values);
  530|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  531|      1|	}
  532|       |
  533|      1|	return (GType) gtype_id;
  534|      1|}
vips_combine_mode_get_type:
  538|      1|{
  539|      1|	static gsize gtype_id = 0;
  540|       |
  541|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  542|      1|		static const GEnumValue values[] = {
  543|      1|			{ VIPS_COMBINE_MODE_SET, "VIPS_COMBINE_MODE_SET", "set" },
  544|      1|			{ VIPS_COMBINE_MODE_ADD, "VIPS_COMBINE_MODE_ADD", "add" },
  545|      1|			{ VIPS_COMBINE_MODE_LAST, "VIPS_COMBINE_MODE_LAST", "last" },
  546|      1|			{ 0, NULL, NULL }
  547|      1|		};
  548|       |
  549|      1|		GType new_type =
  550|      1|			g_enum_register_static(g_intern_static_string("VipsCombineMode"), values);
  551|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  552|      1|	}
  553|       |
  554|      1|	return (GType) gtype_id;
  555|      1|}
vips_foreign_flags_get_type:
  559|      1|{
  560|      1|	static gsize gtype_id = 0;
  561|       |
  562|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  563|      1|		static const GFlagsValue values[] = {
  564|      1|			{ VIPS_FOREIGN_NONE, "VIPS_FOREIGN_NONE", "none" },
  565|      1|			{ VIPS_FOREIGN_PARTIAL, "VIPS_FOREIGN_PARTIAL", "partial" },
  566|      1|			{ VIPS_FOREIGN_BIGENDIAN, "VIPS_FOREIGN_BIGENDIAN", "bigendian" },
  567|      1|			{ VIPS_FOREIGN_SEQUENTIAL, "VIPS_FOREIGN_SEQUENTIAL", "sequential" },
  568|      1|			{ VIPS_FOREIGN_ALL, "VIPS_FOREIGN_ALL", "all" },
  569|      1|			{ 0, NULL, NULL }
  570|      1|		};
  571|       |
  572|      1|		GType new_type =
  573|      1|			g_flags_register_static(g_intern_static_string("VipsForeignFlags"), values);
  574|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  575|      1|	}
  576|       |
  577|      1|	return (GType) gtype_id;
  578|      1|}
vips_fail_on_get_type:
  581|      2|{
  582|      2|	static gsize gtype_id = 0;
  583|       |
  584|      2|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 1]
  |  |  ------------------
  |  |  249|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      2|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      2|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      4|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      4|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      4|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      4|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      4|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      4|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      4|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 1]
  |  |  ------------------
  |  |  252|      2|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      2|  }))
  ------------------
  585|      1|		static const GEnumValue values[] = {
  586|      1|			{ VIPS_FAIL_ON_NONE, "VIPS_FAIL_ON_NONE", "none" },
  587|      1|			{ VIPS_FAIL_ON_TRUNCATED, "VIPS_FAIL_ON_TRUNCATED", "truncated" },
  588|      1|			{ VIPS_FAIL_ON_ERROR, "VIPS_FAIL_ON_ERROR", "error" },
  589|      1|			{ VIPS_FAIL_ON_WARNING, "VIPS_FAIL_ON_WARNING", "warning" },
  590|      1|			{ VIPS_FAIL_ON_LAST, "VIPS_FAIL_ON_LAST", "last" },
  591|      1|			{ 0, NULL, NULL }
  592|      1|		};
  593|       |
  594|      1|		GType new_type =
  595|      1|			g_enum_register_static(g_intern_static_string("VipsFailOn"), values);
  596|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  597|      1|	}
  598|       |
  599|      2|	return (GType) gtype_id;
  600|      2|}
vips_foreign_keep_get_type:
  627|      1|{
  628|      1|	static gsize gtype_id = 0;
  629|       |
  630|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  631|      1|		static const GFlagsValue values[] = {
  632|      1|			{ VIPS_FOREIGN_KEEP_NONE, "VIPS_FOREIGN_KEEP_NONE", "none" },
  633|      1|			{ VIPS_FOREIGN_KEEP_EXIF, "VIPS_FOREIGN_KEEP_EXIF", "exif" },
  634|      1|			{ VIPS_FOREIGN_KEEP_XMP, "VIPS_FOREIGN_KEEP_XMP", "xmp" },
  635|      1|			{ VIPS_FOREIGN_KEEP_IPTC, "VIPS_FOREIGN_KEEP_IPTC", "iptc" },
  636|      1|			{ VIPS_FOREIGN_KEEP_ICC, "VIPS_FOREIGN_KEEP_ICC", "icc" },
  637|      1|			{ VIPS_FOREIGN_KEEP_OTHER, "VIPS_FOREIGN_KEEP_OTHER", "other" },
  638|      1|			{ VIPS_FOREIGN_KEEP_ALL, "VIPS_FOREIGN_KEEP_ALL", "all" },
  639|      1|			{ 0, NULL, NULL }
  640|      1|		};
  641|       |
  642|      1|		GType new_type =
  643|      1|			g_flags_register_static(g_intern_static_string("VipsForeignKeep"), values);
  644|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  645|      1|	}
  646|       |
  647|      1|	return (GType) gtype_id;
  648|      1|}
vips_foreign_subsample_get_type:
  651|      2|{
  652|      2|	static gsize gtype_id = 0;
  653|       |
  654|      2|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 1]
  |  |  ------------------
  |  |  249|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      2|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      2|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      4|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      4|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      4|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      4|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      4|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      4|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      4|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 1]
  |  |  ------------------
  |  |  252|      2|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      2|  }))
  ------------------
  655|      1|		static const GEnumValue values[] = {
  656|      1|			{ VIPS_FOREIGN_SUBSAMPLE_AUTO, "VIPS_FOREIGN_SUBSAMPLE_AUTO", "auto" },
  657|      1|			{ VIPS_FOREIGN_SUBSAMPLE_ON, "VIPS_FOREIGN_SUBSAMPLE_ON", "on" },
  658|      1|			{ VIPS_FOREIGN_SUBSAMPLE_OFF, "VIPS_FOREIGN_SUBSAMPLE_OFF", "off" },
  659|      1|			{ VIPS_FOREIGN_SUBSAMPLE_LAST, "VIPS_FOREIGN_SUBSAMPLE_LAST", "last" },
  660|      1|			{ 0, NULL, NULL }
  661|      1|		};
  662|       |
  663|      1|		GType new_type =
  664|      1|			g_enum_register_static(g_intern_static_string("VipsForeignSubsample"), values);
  665|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  666|      1|	}
  667|       |
  668|      2|	return (GType) gtype_id;
  669|      2|}
vips_foreign_webp_preset_get_type:
  672|      1|{
  673|      1|	static gsize gtype_id = 0;
  674|       |
  675|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  676|      1|		static const GEnumValue values[] = {
  677|      1|			{ VIPS_FOREIGN_WEBP_PRESET_DEFAULT, "VIPS_FOREIGN_WEBP_PRESET_DEFAULT", "default" },
  678|      1|			{ VIPS_FOREIGN_WEBP_PRESET_PICTURE, "VIPS_FOREIGN_WEBP_PRESET_PICTURE", "picture" },
  679|      1|			{ VIPS_FOREIGN_WEBP_PRESET_PHOTO, "VIPS_FOREIGN_WEBP_PRESET_PHOTO", "photo" },
  680|      1|			{ VIPS_FOREIGN_WEBP_PRESET_DRAWING, "VIPS_FOREIGN_WEBP_PRESET_DRAWING", "drawing" },
  681|      1|			{ VIPS_FOREIGN_WEBP_PRESET_ICON, "VIPS_FOREIGN_WEBP_PRESET_ICON", "icon" },
  682|      1|			{ VIPS_FOREIGN_WEBP_PRESET_TEXT, "VIPS_FOREIGN_WEBP_PRESET_TEXT", "text" },
  683|      1|			{ VIPS_FOREIGN_WEBP_PRESET_LAST, "VIPS_FOREIGN_WEBP_PRESET_LAST", "last" },
  684|      1|			{ 0, NULL, NULL }
  685|      1|		};
  686|       |
  687|      1|		GType new_type =
  688|      1|			g_enum_register_static(g_intern_static_string("VipsForeignWebpPreset"), values);
  689|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  690|      1|	}
  691|       |
  692|      1|	return (GType) gtype_id;
  693|      1|}
vips_foreign_tiff_compression_get_type:
  696|      1|{
  697|      1|	static gsize gtype_id = 0;
  698|       |
  699|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  700|      1|		static const GEnumValue values[] = {
  701|      1|			{ VIPS_FOREIGN_TIFF_COMPRESSION_NONE, "VIPS_FOREIGN_TIFF_COMPRESSION_NONE", "none" },
  702|      1|			{ VIPS_FOREIGN_TIFF_COMPRESSION_JPEG, "VIPS_FOREIGN_TIFF_COMPRESSION_JPEG", "jpeg" },
  703|      1|			{ VIPS_FOREIGN_TIFF_COMPRESSION_DEFLATE, "VIPS_FOREIGN_TIFF_COMPRESSION_DEFLATE", "deflate" },
  704|      1|			{ VIPS_FOREIGN_TIFF_COMPRESSION_PACKBITS, "VIPS_FOREIGN_TIFF_COMPRESSION_PACKBITS", "packbits" },
  705|      1|			{ VIPS_FOREIGN_TIFF_COMPRESSION_CCITTFAX4, "VIPS_FOREIGN_TIFF_COMPRESSION_CCITTFAX4", "ccittfax4" },
  706|      1|			{ VIPS_FOREIGN_TIFF_COMPRESSION_LZW, "VIPS_FOREIGN_TIFF_COMPRESSION_LZW", "lzw" },
  707|      1|			{ VIPS_FOREIGN_TIFF_COMPRESSION_WEBP, "VIPS_FOREIGN_TIFF_COMPRESSION_WEBP", "webp" },
  708|      1|			{ VIPS_FOREIGN_TIFF_COMPRESSION_ZSTD, "VIPS_FOREIGN_TIFF_COMPRESSION_ZSTD", "zstd" },
  709|      1|			{ VIPS_FOREIGN_TIFF_COMPRESSION_JP2K, "VIPS_FOREIGN_TIFF_COMPRESSION_JP2K", "jp2k" },
  710|      1|			{ VIPS_FOREIGN_TIFF_COMPRESSION_LAST, "VIPS_FOREIGN_TIFF_COMPRESSION_LAST", "last" },
  711|      1|			{ 0, NULL, NULL }
  712|      1|		};
  713|       |
  714|      1|		GType new_type =
  715|      1|			g_enum_register_static(g_intern_static_string("VipsForeignTiffCompression"), values);
  716|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  717|      1|	}
  718|       |
  719|      1|	return (GType) gtype_id;
  720|      1|}
vips_foreign_tiff_predictor_get_type:
  723|      1|{
  724|      1|	static gsize gtype_id = 0;
  725|       |
  726|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  727|      1|		static const GEnumValue values[] = {
  728|      1|			{ VIPS_FOREIGN_TIFF_PREDICTOR_NONE, "VIPS_FOREIGN_TIFF_PREDICTOR_NONE", "none" },
  729|      1|			{ VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL, "VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL", "horizontal" },
  730|      1|			{ VIPS_FOREIGN_TIFF_PREDICTOR_FLOAT, "VIPS_FOREIGN_TIFF_PREDICTOR_FLOAT", "float" },
  731|      1|			{ VIPS_FOREIGN_TIFF_PREDICTOR_LAST, "VIPS_FOREIGN_TIFF_PREDICTOR_LAST", "last" },
  732|      1|			{ 0, NULL, NULL }
  733|      1|		};
  734|       |
  735|      1|		GType new_type =
  736|      1|			g_enum_register_static(g_intern_static_string("VipsForeignTiffPredictor"), values);
  737|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  738|      1|	}
  739|       |
  740|      1|	return (GType) gtype_id;
  741|      1|}
vips_foreign_tiff_resunit_get_type:
  744|      1|{
  745|      1|	static gsize gtype_id = 0;
  746|       |
  747|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  748|      1|		static const GEnumValue values[] = {
  749|      1|			{ VIPS_FOREIGN_TIFF_RESUNIT_CM, "VIPS_FOREIGN_TIFF_RESUNIT_CM", "cm" },
  750|      1|			{ VIPS_FOREIGN_TIFF_RESUNIT_INCH, "VIPS_FOREIGN_TIFF_RESUNIT_INCH", "inch" },
  751|      1|			{ VIPS_FOREIGN_TIFF_RESUNIT_LAST, "VIPS_FOREIGN_TIFF_RESUNIT_LAST", "last" },
  752|      1|			{ 0, NULL, NULL }
  753|      1|		};
  754|       |
  755|      1|		GType new_type =
  756|      1|			g_enum_register_static(g_intern_static_string("VipsForeignTiffResunit"), values);
  757|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  758|      1|	}
  759|       |
  760|      1|	return (GType) gtype_id;
  761|      1|}
vips_foreign_png_filter_get_type:
  764|      1|{
  765|      1|	static gsize gtype_id = 0;
  766|       |
  767|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  768|      1|		static const GFlagsValue values[] = {
  769|      1|			{ VIPS_FOREIGN_PNG_FILTER_NONE, "VIPS_FOREIGN_PNG_FILTER_NONE", "none" },
  770|      1|			{ VIPS_FOREIGN_PNG_FILTER_SUB, "VIPS_FOREIGN_PNG_FILTER_SUB", "sub" },
  771|      1|			{ VIPS_FOREIGN_PNG_FILTER_UP, "VIPS_FOREIGN_PNG_FILTER_UP", "up" },
  772|      1|			{ VIPS_FOREIGN_PNG_FILTER_AVG, "VIPS_FOREIGN_PNG_FILTER_AVG", "avg" },
  773|      1|			{ VIPS_FOREIGN_PNG_FILTER_PAETH, "VIPS_FOREIGN_PNG_FILTER_PAETH", "paeth" },
  774|      1|			{ VIPS_FOREIGN_PNG_FILTER_ALL, "VIPS_FOREIGN_PNG_FILTER_ALL", "all" },
  775|      1|			{ 0, NULL, NULL }
  776|      1|		};
  777|       |
  778|      1|		GType new_type =
  779|      1|			g_flags_register_static(g_intern_static_string("VipsForeignPngFilter"), values);
  780|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  781|      1|	}
  782|       |
  783|      1|	return (GType) gtype_id;
  784|      1|}
vips_foreign_ppm_format_get_type:
  787|      1|{
  788|      1|	static gsize gtype_id = 0;
  789|       |
  790|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  791|      1|		static const GEnumValue values[] = {
  792|      1|			{ VIPS_FOREIGN_PPM_FORMAT_PBM, "VIPS_FOREIGN_PPM_FORMAT_PBM", "pbm" },
  793|      1|			{ VIPS_FOREIGN_PPM_FORMAT_PGM, "VIPS_FOREIGN_PPM_FORMAT_PGM", "pgm" },
  794|      1|			{ VIPS_FOREIGN_PPM_FORMAT_PPM, "VIPS_FOREIGN_PPM_FORMAT_PPM", "ppm" },
  795|      1|			{ VIPS_FOREIGN_PPM_FORMAT_PFM, "VIPS_FOREIGN_PPM_FORMAT_PFM", "pfm" },
  796|      1|			{ VIPS_FOREIGN_PPM_FORMAT_PNM, "VIPS_FOREIGN_PPM_FORMAT_PNM", "pnm" },
  797|      1|			{ VIPS_FOREIGN_PPM_FORMAT_LAST, "VIPS_FOREIGN_PPM_FORMAT_LAST", "last" },
  798|      1|			{ 0, NULL, NULL }
  799|      1|		};
  800|       |
  801|      1|		GType new_type =
  802|      1|			g_enum_register_static(g_intern_static_string("VipsForeignPpmFormat"), values);
  803|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  804|      1|	}
  805|       |
  806|      1|	return (GType) gtype_id;
  807|      1|}
vips_foreign_dz_depth_get_type:
  833|      1|{
  834|      1|	static gsize gtype_id = 0;
  835|       |
  836|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  837|      1|		static const GEnumValue values[] = {
  838|      1|			{ VIPS_FOREIGN_DZ_DEPTH_ONEPIXEL, "VIPS_FOREIGN_DZ_DEPTH_ONEPIXEL", "onepixel" },
  839|      1|			{ VIPS_FOREIGN_DZ_DEPTH_ONETILE, "VIPS_FOREIGN_DZ_DEPTH_ONETILE", "onetile" },
  840|      1|			{ VIPS_FOREIGN_DZ_DEPTH_ONE, "VIPS_FOREIGN_DZ_DEPTH_ONE", "one" },
  841|      1|			{ VIPS_FOREIGN_DZ_DEPTH_LAST, "VIPS_FOREIGN_DZ_DEPTH_LAST", "last" },
  842|      1|			{ 0, NULL, NULL }
  843|      1|		};
  844|       |
  845|      1|		GType new_type =
  846|      1|			g_enum_register_static(g_intern_static_string("VipsForeignDzDepth"), values);
  847|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  848|      1|	}
  849|       |
  850|      1|	return (GType) gtype_id;
  851|      1|}
vips_foreign_heif_compression_get_type:
  875|  7.06k|{
  876|  7.06k|	static gsize gtype_id = 0;
  877|       |
  878|  7.06k|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|  7.06k|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|  7.06k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 7.06k]
  |  |  ------------------
  |  |  249|  7.06k|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|  7.06k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|  7.06k|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|  7.06k|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|  14.1k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  7.06k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|  14.1k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|  7.06k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|  14.1k|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|  14.1k|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|  14.1k|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|  14.1k|    gapg_temp_newval;                                                        \
  |  |  |  |  131|  14.1k|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 7.06k]
  |  |  ------------------
  |  |  252|  7.06k|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|  7.06k|  }))
  ------------------
  879|      1|		static const GEnumValue values[] = {
  880|      1|			{ VIPS_FOREIGN_HEIF_COMPRESSION_HEVC, "VIPS_FOREIGN_HEIF_COMPRESSION_HEVC", "hevc" },
  881|      1|			{ VIPS_FOREIGN_HEIF_COMPRESSION_AVC, "VIPS_FOREIGN_HEIF_COMPRESSION_AVC", "avc" },
  882|      1|			{ VIPS_FOREIGN_HEIF_COMPRESSION_JPEG, "VIPS_FOREIGN_HEIF_COMPRESSION_JPEG", "jpeg" },
  883|      1|			{ VIPS_FOREIGN_HEIF_COMPRESSION_AV1, "VIPS_FOREIGN_HEIF_COMPRESSION_AV1", "av1" },
  884|      1|			{ VIPS_FOREIGN_HEIF_COMPRESSION_LAST, "VIPS_FOREIGN_HEIF_COMPRESSION_LAST", "last" },
  885|      1|			{ 0, NULL, NULL }
  886|      1|		};
  887|       |
  888|      1|		GType new_type =
  889|      1|			g_enum_register_static(g_intern_static_string("VipsForeignHeifCompression"), values);
  890|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  891|      1|	}
  892|       |
  893|  7.06k|	return (GType) gtype_id;
  894|  7.06k|}
vips_foreign_heif_encoder_get_type:
  897|      1|{
  898|      1|	static gsize gtype_id = 0;
  899|       |
  900|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  901|      1|		static const GEnumValue values[] = {
  902|      1|			{ VIPS_FOREIGN_HEIF_ENCODER_AUTO, "VIPS_FOREIGN_HEIF_ENCODER_AUTO", "auto" },
  903|      1|			{ VIPS_FOREIGN_HEIF_ENCODER_AOM, "VIPS_FOREIGN_HEIF_ENCODER_AOM", "aom" },
  904|      1|			{ VIPS_FOREIGN_HEIF_ENCODER_RAV1E, "VIPS_FOREIGN_HEIF_ENCODER_RAV1E", "rav1e" },
  905|      1|			{ VIPS_FOREIGN_HEIF_ENCODER_SVT, "VIPS_FOREIGN_HEIF_ENCODER_SVT", "svt" },
  906|      1|			{ VIPS_FOREIGN_HEIF_ENCODER_X265, "VIPS_FOREIGN_HEIF_ENCODER_X265", "x265" },
  907|      1|			{ VIPS_FOREIGN_HEIF_ENCODER_LAST, "VIPS_FOREIGN_HEIF_ENCODER_LAST", "last" },
  908|      1|			{ 0, NULL, NULL }
  909|      1|		};
  910|       |
  911|      1|		GType new_type =
  912|      1|			g_enum_register_static(g_intern_static_string("VipsForeignHeifEncoder"), values);
  913|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  914|      1|	}
  915|       |
  916|      1|	return (GType) gtype_id;
  917|      1|}
vips_demand_style_get_type:
  921|      1|{
  922|      1|	static gsize gtype_id = 0;
  923|       |
  924|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
  925|      1|		static const GEnumValue values[] = {
  926|      1|			{ VIPS_DEMAND_STYLE_ERROR, "VIPS_DEMAND_STYLE_ERROR", "error" },
  927|      1|			{ VIPS_DEMAND_STYLE_SMALLTILE, "VIPS_DEMAND_STYLE_SMALLTILE", "smalltile" },
  928|      1|			{ VIPS_DEMAND_STYLE_FATSTRIP, "VIPS_DEMAND_STYLE_FATSTRIP", "fatstrip" },
  929|      1|			{ VIPS_DEMAND_STYLE_THINSTRIP, "VIPS_DEMAND_STYLE_THINSTRIP", "thinstrip" },
  930|      1|			{ VIPS_DEMAND_STYLE_ANY, "VIPS_DEMAND_STYLE_ANY", "any" },
  931|      1|			{ 0, NULL, NULL }
  932|      1|		};
  933|       |
  934|      1|		GType new_type =
  935|      1|			g_enum_register_static(g_intern_static_string("VipsDemandStyle"), values);
  936|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
  937|      1|	}
  938|       |
  939|      1|	return (GType) gtype_id;
  940|      1|}
vips_interpretation_get_type:
  969|      7|{
  970|      7|	static gsize gtype_id = 0;
  971|       |
  972|      7|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      7|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      7|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 6]
  |  |  ------------------
  |  |  249|      7|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      7|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      7|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      7|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|     14|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      7|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|     14|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      7|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|     14|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|     14|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|     14|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|     14|    gapg_temp_newval;                                                        \
  |  |  |  |  131|     14|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 6]
  |  |  ------------------
  |  |  252|      7|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      7|  }))
  ------------------
  973|      1|		static const GEnumValue values[] = {
  974|      1|			{ VIPS_INTERPRETATION_ERROR, "VIPS_INTERPRETATION_ERROR", "error" },
  975|      1|			{ VIPS_INTERPRETATION_MULTIBAND, "VIPS_INTERPRETATION_MULTIBAND", "multiband" },
  976|      1|			{ VIPS_INTERPRETATION_B_W, "VIPS_INTERPRETATION_B_W", "b-w" },
  977|      1|			{ VIPS_INTERPRETATION_HISTOGRAM, "VIPS_INTERPRETATION_HISTOGRAM", "histogram" },
  978|      1|			{ VIPS_INTERPRETATION_XYZ, "VIPS_INTERPRETATION_XYZ", "xyz" },
  979|      1|			{ VIPS_INTERPRETATION_LAB, "VIPS_INTERPRETATION_LAB", "lab" },
  980|      1|			{ VIPS_INTERPRETATION_CMYK, "VIPS_INTERPRETATION_CMYK", "cmyk" },
  981|      1|			{ VIPS_INTERPRETATION_LABQ, "VIPS_INTERPRETATION_LABQ", "labq" },
  982|      1|			{ VIPS_INTERPRETATION_RGB, "VIPS_INTERPRETATION_RGB", "rgb" },
  983|      1|			{ VIPS_INTERPRETATION_CMC, "VIPS_INTERPRETATION_CMC", "cmc" },
  984|      1|			{ VIPS_INTERPRETATION_LCH, "VIPS_INTERPRETATION_LCH", "lch" },
  985|      1|			{ VIPS_INTERPRETATION_LABS, "VIPS_INTERPRETATION_LABS", "labs" },
  986|      1|			{ VIPS_INTERPRETATION_sRGB, "VIPS_INTERPRETATION_sRGB", "srgb" },
  987|      1|			{ VIPS_INTERPRETATION_YXY, "VIPS_INTERPRETATION_YXY", "yxy" },
  988|      1|			{ VIPS_INTERPRETATION_FOURIER, "VIPS_INTERPRETATION_FOURIER", "fourier" },
  989|      1|			{ VIPS_INTERPRETATION_RGB16, "VIPS_INTERPRETATION_RGB16", "rgb16" },
  990|      1|			{ VIPS_INTERPRETATION_GREY16, "VIPS_INTERPRETATION_GREY16", "grey16" },
  991|      1|			{ VIPS_INTERPRETATION_MATRIX, "VIPS_INTERPRETATION_MATRIX", "matrix" },
  992|      1|			{ VIPS_INTERPRETATION_scRGB, "VIPS_INTERPRETATION_scRGB", "scrgb" },
  993|      1|			{ VIPS_INTERPRETATION_HSV, "VIPS_INTERPRETATION_HSV", "hsv" },
  994|      1|			{ VIPS_INTERPRETATION_LAST, "VIPS_INTERPRETATION_LAST", "last" },
  995|      1|			{ 0, NULL, NULL }
  996|      1|		};
  997|       |
  998|      1|		GType new_type =
  999|      1|			g_enum_register_static(g_intern_static_string("VipsInterpretation"), values);
 1000|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
 1001|      1|	}
 1002|       |
 1003|      7|	return (GType) gtype_id;
 1004|      7|}
vips_band_format_get_type:
 1007|      4|{
 1008|      4|	static gsize gtype_id = 0;
 1009|       |
 1010|      4|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      4|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      4|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 3]
  |  |  ------------------
  |  |  249|      4|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      4|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      4|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      4|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      8|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      4|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      8|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      4|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      8|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      8|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      8|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      8|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      8|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 3]
  |  |  ------------------
  |  |  252|      4|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      4|  }))
  ------------------
 1011|      1|		static const GEnumValue values[] = {
 1012|      1|			{ VIPS_FORMAT_NOTSET, "VIPS_FORMAT_NOTSET", "notset" },
 1013|      1|			{ VIPS_FORMAT_UCHAR, "VIPS_FORMAT_UCHAR", "uchar" },
 1014|      1|			{ VIPS_FORMAT_CHAR, "VIPS_FORMAT_CHAR", "char" },
 1015|      1|			{ VIPS_FORMAT_USHORT, "VIPS_FORMAT_USHORT", "ushort" },
 1016|      1|			{ VIPS_FORMAT_SHORT, "VIPS_FORMAT_SHORT", "short" },
 1017|      1|			{ VIPS_FORMAT_UINT, "VIPS_FORMAT_UINT", "uint" },
 1018|      1|			{ VIPS_FORMAT_INT, "VIPS_FORMAT_INT", "int" },
 1019|      1|			{ VIPS_FORMAT_FLOAT, "VIPS_FORMAT_FLOAT", "float" },
 1020|      1|			{ VIPS_FORMAT_COMPLEX, "VIPS_FORMAT_COMPLEX", "complex" },
 1021|      1|			{ VIPS_FORMAT_DOUBLE, "VIPS_FORMAT_DOUBLE", "double" },
 1022|      1|			{ VIPS_FORMAT_DPCOMPLEX, "VIPS_FORMAT_DPCOMPLEX", "dpcomplex" },
 1023|      1|			{ VIPS_FORMAT_LAST, "VIPS_FORMAT_LAST", "last" },
 1024|      1|			{ 0, NULL, NULL }
 1025|      1|		};
 1026|       |
 1027|      1|		GType new_type =
 1028|      1|			g_enum_register_static(g_intern_static_string("VipsBandFormat"), values);
 1029|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
 1030|      1|	}
 1031|       |
 1032|      4|	return (GType) gtype_id;
 1033|      4|}
vips_coding_get_type:
 1036|      2|{
 1037|      2|	static gsize gtype_id = 0;
 1038|       |
 1039|      2|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 1]
  |  |  ------------------
  |  |  249|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      2|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      2|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      4|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      4|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      4|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      4|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      4|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      4|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      4|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 1]
  |  |  ------------------
  |  |  252|      2|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      2|  }))
  ------------------
 1040|      1|		static const GEnumValue values[] = {
 1041|      1|			{ VIPS_CODING_ERROR, "VIPS_CODING_ERROR", "error" },
 1042|      1|			{ VIPS_CODING_NONE, "VIPS_CODING_NONE", "none" },
 1043|      1|			{ VIPS_CODING_LABQ, "VIPS_CODING_LABQ", "labq" },
 1044|      1|			{ VIPS_CODING_RAD, "VIPS_CODING_RAD", "rad" },
 1045|      1|			{ VIPS_CODING_LAST, "VIPS_CODING_LAST", "last" },
 1046|      1|			{ 0, NULL, NULL }
 1047|      1|		};
 1048|       |
 1049|      1|		GType new_type =
 1050|      1|			g_enum_register_static(g_intern_static_string("VipsCoding"), values);
 1051|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
 1052|      1|	}
 1053|       |
 1054|      2|	return (GType) gtype_id;
 1055|      2|}
vips_access_get_type:
 1058|      3|{
 1059|      3|	static gsize gtype_id = 0;
 1060|       |
 1061|      3|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      3|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      3|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 2]
  |  |  ------------------
  |  |  249|      3|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      3|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      3|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      3|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      6|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      3|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      6|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      3|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      6|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      6|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      6|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      6|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      6|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 2]
  |  |  ------------------
  |  |  252|      3|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      3|  }))
  ------------------
 1062|      1|		static const GEnumValue values[] = {
 1063|      1|			{ VIPS_ACCESS_RANDOM, "VIPS_ACCESS_RANDOM", "random" },
 1064|      1|			{ VIPS_ACCESS_SEQUENTIAL, "VIPS_ACCESS_SEQUENTIAL", "sequential" },
 1065|      1|			{ VIPS_ACCESS_SEQUENTIAL_UNBUFFERED, "VIPS_ACCESS_SEQUENTIAL_UNBUFFERED", "sequential-unbuffered" },
 1066|      1|			{ VIPS_ACCESS_LAST, "VIPS_ACCESS_LAST", "last" },
 1067|      1|			{ 0, NULL, NULL }
 1068|      1|		};
 1069|       |
 1070|      1|		GType new_type =
 1071|      1|			g_enum_register_static(g_intern_static_string("VipsAccess"), values);
 1072|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
 1073|      1|	}
 1074|       |
 1075|      3|	return (GType) gtype_id;
 1076|      3|}
vips_operation_morphology_get_type:
 1080|      1|{
 1081|      1|	static gsize gtype_id = 0;
 1082|       |
 1083|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
 1084|      1|		static const GEnumValue values[] = {
 1085|      1|			{ VIPS_OPERATION_MORPHOLOGY_ERODE, "VIPS_OPERATION_MORPHOLOGY_ERODE", "erode" },
 1086|      1|			{ VIPS_OPERATION_MORPHOLOGY_DILATE, "VIPS_OPERATION_MORPHOLOGY_DILATE", "dilate" },
 1087|      1|			{ VIPS_OPERATION_MORPHOLOGY_LAST, "VIPS_OPERATION_MORPHOLOGY_LAST", "last" },
 1088|      1|			{ 0, NULL, NULL }
 1089|      1|		};
 1090|       |
 1091|      1|		GType new_type =
 1092|      1|			g_enum_register_static(g_intern_static_string("VipsOperationMorphology"), values);
 1093|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
 1094|      1|	}
 1095|       |
 1096|      1|	return (GType) gtype_id;
 1097|      1|}
vips_region_shrink_get_type:
 1155|      1|{
 1156|      1|	static gsize gtype_id = 0;
 1157|       |
 1158|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
 1159|      1|		static const GEnumValue values[] = {
 1160|      1|			{ VIPS_REGION_SHRINK_MEAN, "VIPS_REGION_SHRINK_MEAN", "mean" },
 1161|      1|			{ VIPS_REGION_SHRINK_MEDIAN, "VIPS_REGION_SHRINK_MEDIAN", "median" },
 1162|      1|			{ VIPS_REGION_SHRINK_MODE, "VIPS_REGION_SHRINK_MODE", "mode" },
 1163|      1|			{ VIPS_REGION_SHRINK_MAX, "VIPS_REGION_SHRINK_MAX", "max" },
 1164|      1|			{ VIPS_REGION_SHRINK_MIN, "VIPS_REGION_SHRINK_MIN", "min" },
 1165|      1|			{ VIPS_REGION_SHRINK_NEAREST, "VIPS_REGION_SHRINK_NEAREST", "nearest" },
 1166|      1|			{ VIPS_REGION_SHRINK_LAST, "VIPS_REGION_SHRINK_LAST", "last" },
 1167|      1|			{ 0, NULL, NULL }
 1168|      1|		};
 1169|       |
 1170|      1|		GType new_type =
 1171|      1|			g_enum_register_static(g_intern_static_string("VipsRegionShrink"), values);
 1172|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
 1173|      1|	}
 1174|       |
 1175|      1|	return (GType) gtype_id;
 1176|      1|}
vips_kernel_get_type:
 1180|      4|{
 1181|      4|	static gsize gtype_id = 0;
 1182|       |
 1183|      4|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      4|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      4|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 3]
  |  |  ------------------
  |  |  249|      4|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      4|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      4|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      4|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      8|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      4|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      8|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      4|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      8|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      8|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      8|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      8|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      8|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 3]
  |  |  ------------------
  |  |  252|      4|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      4|  }))
  ------------------
 1184|      1|		static const GEnumValue values[] = {
 1185|      1|			{ VIPS_KERNEL_NEAREST, "VIPS_KERNEL_NEAREST", "nearest" },
 1186|      1|			{ VIPS_KERNEL_LINEAR, "VIPS_KERNEL_LINEAR", "linear" },
 1187|      1|			{ VIPS_KERNEL_CUBIC, "VIPS_KERNEL_CUBIC", "cubic" },
 1188|      1|			{ VIPS_KERNEL_MITCHELL, "VIPS_KERNEL_MITCHELL", "mitchell" },
 1189|      1|			{ VIPS_KERNEL_LANCZOS2, "VIPS_KERNEL_LANCZOS2", "lanczos2" },
 1190|      1|			{ VIPS_KERNEL_LANCZOS3, "VIPS_KERNEL_LANCZOS3", "lanczos3" },
 1191|      1|			{ VIPS_KERNEL_MKS2013, "VIPS_KERNEL_MKS2013", "mks2013" },
 1192|      1|			{ VIPS_KERNEL_MKS2021, "VIPS_KERNEL_MKS2021", "mks2021" },
 1193|      1|			{ VIPS_KERNEL_LAST, "VIPS_KERNEL_LAST", "last" },
 1194|      1|			{ 0, NULL, NULL }
 1195|      1|		};
 1196|       |
 1197|      1|		GType new_type =
 1198|      1|			g_enum_register_static(g_intern_static_string("VipsKernel"), values);
 1199|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
 1200|      1|	}
 1201|       |
 1202|      4|	return (GType) gtype_id;
 1203|      4|}
vips_size_get_type:
 1206|      1|{
 1207|      1|	static gsize gtype_id = 0;
 1208|       |
 1209|      1|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 0]
  |  |  ------------------
  |  |  249|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      1|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      1|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      2|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      2|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      2|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      2|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      2|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      2|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      2|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  252|      1|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|      1|  }))
  ------------------
 1210|      1|		static const GEnumValue values[] = {
 1211|      1|			{ VIPS_SIZE_BOTH, "VIPS_SIZE_BOTH", "both" },
 1212|      1|			{ VIPS_SIZE_UP, "VIPS_SIZE_UP", "up" },
 1213|      1|			{ VIPS_SIZE_DOWN, "VIPS_SIZE_DOWN", "down" },
 1214|      1|			{ VIPS_SIZE_FORCE, "VIPS_SIZE_FORCE", "force" },
 1215|      1|			{ VIPS_SIZE_LAST, "VIPS_SIZE_LAST", "last" },
 1216|      1|			{ 0, NULL, NULL }
 1217|      1|		};
 1218|       |
 1219|      1|		GType new_type =
 1220|      1|			g_enum_register_static(g_intern_static_string("VipsSize"), values);
 1221|      1|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      1|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      1|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      1|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      1|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      1|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      1|  }))
  ------------------
 1222|      1|	}
 1223|       |
 1224|      1|	return (GType) gtype_id;
 1225|      1|}

vips_INT__VOID:
   60|   819k|{
   61|   819k|  typedef gint (*GMarshalFunc_INT__VOID) (gpointer data1,
   62|   819k|                                          gpointer data2);
   63|   819k|  GCClosure *cc = (GCClosure *) closure;
   64|   819k|  gpointer data1, data2;
   65|   819k|  GMarshalFunc_INT__VOID callback;
   66|   819k|  gint v_return;
   67|       |
   68|   819k|  g_return_if_fail (return_value != NULL);
  ------------------
  |  |  572|   819k|#define g_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   819k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   819k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   69|   819k|  g_return_if_fail (n_param_values == 1);
  ------------------
  |  |  572|   819k|#define g_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   819k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   819k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   70|       |
   71|   819k|  if (G_CCLOSURE_SWAP_DATA (closure))
  ------------------
  |  |   63|   819k|#define	G_CCLOSURE_SWAP_DATA(cclosure)	 (((GClosure*) (cclosure))->derivative_flag)
  |  |  ------------------
  |  |  |  Branch (63:41): [True: 0, False: 819k]
  |  |  ------------------
  ------------------
   72|      0|    {
   73|      0|      data1 = closure->data;
   74|      0|      data2 = g_value_peek_pointer (param_values + 0);
   75|      0|    }
   76|   819k|  else
   77|   819k|    {
   78|   819k|      data1 = g_value_peek_pointer (param_values + 0);
   79|   819k|      data2 = closure->data;
   80|   819k|    }
   81|   819k|  callback = (GMarshalFunc_INT__VOID) (marshal_data ? marshal_data : cc->callback);
  ------------------
  |  Branch (81:40): [True: 819k, False: 0]
  ------------------
   82|       |
   83|   819k|  v_return = callback (data1,
   84|   819k|                       data2);
   85|       |
   86|   819k|  g_value_set_int (return_value, v_return);
   87|   819k|}

LLVMFuzzerInitialize:
   13|      2|{
   14|      2|	if (VIPS_INIT(*argv[0]))
  ------------------
  |  |  153|      2|	(vips_version(3) - vips_version(5) != \
  |  |  ------------------
  |  |  |  Branch (153:2): [True: 0, False: 2]
  |  |  |  Branch (153:3): [True: 0, False: 2]
  |  |  ------------------
  |  |  154|      2|				VIPS_LIBRARY_CURRENT - VIPS_LIBRARY_AGE \
  |  |  ------------------
  |  |  |  |   15|      2|#define VIPS_LIBRARY_CURRENT (61)
  |  |  ------------------
  |  |               				VIPS_LIBRARY_CURRENT - VIPS_LIBRARY_AGE \
  |  |  ------------------
  |  |  |  |   17|      2|#define VIPS_LIBRARY_AGE (19)
  |  |  ------------------
  |  |  155|      2|			? ( \
  |  |  156|      0|				  g_warning("ABI mismatch"), \
  |  |  ------------------
  |  |  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|#define G_LOG_DOMAIN    ((gchar*) 0)
  |  |  |  |  ------------------
  |  |  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  |  |  340|      0|                               __VA_ARGS__)
  |  |  ------------------
  |  |  157|      0|				  g_warning("library has ABI version %d", \
  |  |  ------------------
  |  |  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|#define G_LOG_DOMAIN    ((gchar*) 0)
  |  |  |  |  ------------------
  |  |  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  |  |  340|      0|                               __VA_ARGS__)
  |  |  ------------------
  |  |  158|      0|					  vips_version(3) - vips_version(5)), \
  |  |  159|      0|				  g_warning("application needs ABI version %d", \
  |  |  ------------------
  |  |  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|#define G_LOG_DOMAIN    ((gchar*) 0)
  |  |  |  |  ------------------
  |  |  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  |  |  340|      0|                               __VA_ARGS__)
  |  |  ------------------
  |  |  160|      0|					  VIPS_LIBRARY_CURRENT - VIPS_LIBRARY_AGE), \
  |  |  161|      0|				  vips_error("vips_init", "ABI mismatch"), \
  |  |  162|      0|				  -1) \
  |  |  163|      2|			: vips_init(ARGV0))
  ------------------
   15|      0|		return -1;
   16|       |
   17|      2|	vips_concurrency_set(1);
   18|       |
   19|       |#ifdef DEBUG
   20|       |	printf("available suffixes:\n");
   21|       |	GSList *suffixes = nullptr;
   22|       |	char **array = vips_foreign_get_suffixes();
   23|       |	for (int i = 0; array[i] != nullptr; i++) {
   24|       |		if (!g_slist_find_custom(suffixes, array[i],
   25|       |			(GCompareFunc) g_strcmp0)) {
   26|       |			printf("%s\n", array[i]);
   27|       |			suffixes = g_slist_append(suffixes, g_strdup(array[i]));
   28|       |		}
   29|       |
   30|       |		g_free(array[i]);
   31|       |	}
   32|       |	g_free(array);
   33|       |	g_slist_free_full(suffixes, g_free);
   34|       |#endif
   35|       |
   36|      2|	return 0;
   37|      2|}
LLVMFuzzerTestOneInput:
   41|  16.7k|{
   42|  16.7k|	VipsImage *image;
   43|  16.7k|	void *buf;
   44|  16.7k|	size_t len;
   45|       |
   46|  16.7k|	if (!(image = vips_image_new_from_buffer(data, size, "", nullptr)))
  ------------------
  |  Branch (46:6): [True: 5.28k, False: 11.4k]
  ------------------
   47|  5.28k|		return 0;
   48|       |
   49|  11.4k|	if (image->Xsize > 100 ||
  ------------------
  |  Branch (49:6): [True: 330, False: 11.1k]
  ------------------
   50|  11.4k|		image->Ysize > 100 ||
  ------------------
  |  Branch (50:3): [True: 186, False: 10.9k]
  ------------------
   51|  11.4k|		image->Bands > 4) {
  ------------------
  |  Branch (51:3): [True: 28, False: 10.9k]
  ------------------
   52|    544|		g_object_unref(image);
   53|    544|		return 0;
   54|    544|	}
   55|       |
   56|  10.9k|	if (vips_image_write_to_buffer(image, SAVE_SUFFIX, &buf, &len, nullptr)) {
  ------------------
  |  Branch (56:6): [True: 6.88k, False: 4.03k]
  ------------------
   57|  6.88k|		g_object_unref(image);
   58|  6.88k|		return 0;
   59|  6.88k|	}
   60|       |
   61|  4.03k|	g_free(buf);
   62|  4.03k|	g_object_unref(image);
   63|       |
   64|  4.03k|	return 0;
   65|  10.9k|}

abs.c:vips_abs_class_init:
  195|      1|{
  196|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  197|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  198|       |
  199|      1|	object_class->nickname = "abs";
  200|      1|	object_class->description = _("absolute value of an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  201|      1|	object_class->build = vips_abs_build;
  202|       |
  203|      1|	aclass->process_line = vips_abs_buffer;
  204|       |
  205|      1|	vips_arithmetic_set_format_table(aclass, vips_abs_format_table);
  206|      1|}

add.c:vips_add_class_init:
  173|      1|{
  174|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  175|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  176|       |
  177|      1|	object_class->nickname = "add";
  178|      1|	object_class->description = _("add two images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  179|       |
  180|      1|	aclass->process_line = add_buffer;
  181|       |
  182|      1|	vips_arithmetic_set_format_table(aclass, vips_add_format_table);
  183|      1|}

vips__formatalike_vec:
  320|  21.6k|{
  321|  21.6k|	int i;
  322|  21.6k|	VipsBandFormat format;
  323|       |
  324|  21.6k|	g_assert(n >= 1);
  ------------------
  |  |  166|  21.6k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  21.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  21.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  325|       |
  326|  21.6k|	format = in[0]->BandFmt;
  327|  26.2k|	for (i = 1; i < n; i++)
  ------------------
  |  Branch (327:14): [True: 4.58k, False: 21.6k]
  ------------------
  328|  4.58k|		format = vips_format_common(format, in[i]->BandFmt);
  329|       |
  330|  47.8k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (330:14): [True: 26.2k, False: 21.6k]
  ------------------
  331|  26.2k|		if (in[i]->BandFmt == format) {
  ------------------
  |  Branch (331:7): [True: 26.2k, False: 0]
  ------------------
  332|       |			/* Already in the right format ... just copy the image
  333|       |			 * pointer and add a ref.
  334|       |			 */
  335|  26.2k|			out[i] = in[i];
  336|  26.2k|			g_object_ref(in[i]);
  337|  26.2k|		}
  338|      0|		else {
  339|      0|			if (vips_cast(in[i], &out[i], format, NULL))
  ------------------
  |  Branch (339:8): [True: 0, False: 0]
  ------------------
  340|      0|				return -1;
  341|      0|		}
  342|       |
  343|  21.6k|	return 0;
  344|  21.6k|}
vips__sizealike_vec:
  348|  21.6k|{
  349|  21.6k|	int i;
  350|  21.6k|	int width_max;
  351|  21.6k|	int height_max;
  352|       |
  353|  21.6k|	g_assert(n >= 1);
  ------------------
  |  |  166|  21.6k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  21.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  21.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  354|       |
  355|  21.6k|	width_max = in[0]->Xsize;
  356|  21.6k|	height_max = in[0]->Ysize;
  357|  26.2k|	for (i = 1; i < n; i++) {
  ------------------
  |  Branch (357:14): [True: 4.58k, False: 21.6k]
  ------------------
  358|  4.58k|		width_max = VIPS_MAX(width_max, in[i]->Xsize);
  ------------------
  |  |   54|  4.58k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 4.58k]
  |  |  ------------------
  ------------------
  359|  4.58k|		height_max = VIPS_MAX(height_max, in[i]->Ysize);
  ------------------
  |  |   54|  4.58k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 4.58k]
  |  |  ------------------
  ------------------
  360|  4.58k|	}
  361|       |
  362|  47.8k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (362:14): [True: 26.2k, False: 21.6k]
  ------------------
  363|  26.2k|		if (in[i]->Xsize == width_max &&
  ------------------
  |  Branch (363:7): [True: 26.2k, False: 0]
  ------------------
  364|  26.2k|			in[i]->Ysize == height_max) {
  ------------------
  |  Branch (364:4): [True: 26.2k, False: 0]
  ------------------
  365|       |			/* Already the right size ... just copy the image
  366|       |			 * pointer and add a ref.
  367|       |			 */
  368|  26.2k|			out[i] = in[i];
  369|  26.2k|			g_object_ref(in[i]);
  370|  26.2k|		}
  371|      0|		else {
  372|      0|			if (vips_embed(in[i], &out[i],
  ------------------
  |  Branch (372:8): [True: 0, False: 0]
  ------------------
  373|      0|					0, 0, width_max, height_max, NULL))
  374|      0|				return -1;
  375|      0|		}
  376|       |
  377|  21.6k|	return 0;
  378|  21.6k|}
vips__bandalike_vec:
  420|  9.24k|{
  421|  9.24k|	int i;
  422|  9.24k|	int max_bands;
  423|  9.24k|	VipsInterpretation interpretation;
  424|       |
  425|  9.24k|	g_assert(n >= 1);
  ------------------
  |  |  166|  9.24k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  9.24k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.24k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  426|       |
  427|       |	/* We try to set the interpretation of the output images from the
  428|       |	 * interpretation of the n-band input. For example, if we are matching
  429|       |	 * a set of BW images to an RGB image, we want the BW images to be
  430|       |	 * tagged as RGB.
  431|       |	 */
  432|  9.24k|	max_bands = base_bands;
  433|  9.24k|	interpretation = VIPS_INTERPRETATION_ERROR;
  434|  18.4k|	for (i = 0; i < n; i++) {
  ------------------
  |  Branch (434:14): [True: 9.24k, False: 9.24k]
  ------------------
  435|       |		/* >= so we can pick up interpretation if base_bands is equal
  436|       |		 * to the number of bands of the largest image.
  437|       |		 */
  438|  9.24k|		if (in[i]->Bands >= max_bands) {
  ------------------
  |  Branch (438:7): [True: 9.24k, False: 0]
  ------------------
  439|  9.24k|			max_bands = in[i]->Bands;
  440|  9.24k|			interpretation = in[i]->Type;
  441|  9.24k|		}
  442|  9.24k|	}
  443|       |
  444|  18.4k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (444:14): [True: 9.24k, False: 9.24k]
  ------------------
  445|  9.24k|		if (in[i]->Bands == max_bands) {
  ------------------
  |  Branch (445:7): [True: 9.24k, False: 0]
  ------------------
  446|       |			/* Already the right number of bands ... just copy the
  447|       |			 * image pointer and add a ref.
  448|       |			 */
  449|  9.24k|			out[i] = in[i];
  450|  9.24k|			g_object_ref(in[i]);
  451|  9.24k|		}
  452|      0|		else {
  453|      0|			if (vips__bandup(domain, in[i], &out[i], max_bands))
  ------------------
  |  Branch (453:8): [True: 0, False: 0]
  ------------------
  454|      0|				return -1;
  455|       |
  456|      0|			if (interpretation != VIPS_INTERPRETATION_ERROR)
  ------------------
  |  Branch (456:8): [True: 0, False: 0]
  ------------------
  457|      0|				out[i]->Type = interpretation;
  458|      0|		}
  459|       |
  460|  9.24k|	return 0;
  461|  9.24k|}
vips_arithmetic_set_format_table:
  747|     26|{
  748|     26|	g_assert(!class->format_table);
  ------------------
  |  |  166|     26|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|     26|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     26|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  749|       |
  750|     26|	class->format_table = format_table;
  751|     26|}
vips_arithmetic_operation_init:
  758|      2|{
  759|      2|	extern GType vips_add_get_type(void);
  760|      2|	extern GType vips_clamp_get_type(void);
  761|      2|	extern GType vips_minpair_get_type(void);
  762|      2|	extern GType vips_maxpair_get_type(void);
  763|      2|	extern GType vips_sum_get_type(void);
  764|      2|	extern GType vips_subtract_get_type(void);
  765|      2|	extern GType vips_multiply_get_type(void);
  766|      2|	extern GType vips_divide_get_type(void);
  767|      2|	extern GType vips_invert_get_type(void);
  768|      2|	extern GType vips_avg_get_type(void);
  769|      2|	extern GType vips_min_get_type(void);
  770|      2|	extern GType vips_max_get_type(void);
  771|      2|	extern GType vips_deviate_get_type(void);
  772|      2|	extern GType vips_linear_get_type(void);
  773|      2|	extern GType vips_math_get_type(void);
  774|      2|	extern GType vips_abs_get_type(void);
  775|      2|	extern GType vips_sign_get_type(void);
  776|      2|	extern GType vips_stats_get_type(void);
  777|      2|	extern GType vips_hist_find_get_type(void);
  778|      2|	extern GType vips_hist_find_ndim_get_type(void);
  779|      2|	extern GType vips_hist_find_indexed_get_type(void);
  780|      2|	extern GType vips_hough_line_get_type(void);
  781|      2|	extern GType vips_hough_circle_get_type(void);
  782|      2|	extern GType vips_project_get_type(void);
  783|      2|	extern GType vips_profile_get_type(void);
  784|      2|	extern GType vips_measure_get_type(void);
  785|      2|	extern GType vips_getpoint_get_type(void);
  786|      2|	extern GType vips_round_get_type(void);
  787|      2|	extern GType vips_relational_get_type(void);
  788|      2|	extern GType vips_relational_const_get_type(void);
  789|      2|	extern GType vips_remainder_get_type(void);
  790|      2|	extern GType vips_remainder_const_get_type(void);
  791|      2|	extern GType vips_boolean_get_type(void);
  792|      2|	extern GType vips_boolean_const_get_type(void);
  793|      2|	extern GType vips_math2_get_type(void);
  794|      2|	extern GType vips_math2_const_get_type(void);
  795|      2|	extern GType vips_complex_get_type(void);
  796|      2|	extern GType vips_complex2_get_type(void);
  797|      2|	extern GType vips_complexget_get_type(void);
  798|      2|	extern GType vips_complexform_get_type(void);
  799|      2|	extern GType vips_find_trim_get_type(void);
  800|       |
  801|      2|	vips_add_get_type();
  802|      2|	vips_clamp_get_type();
  803|      2|	vips_minpair_get_type();
  804|      2|	vips_maxpair_get_type();
  805|      2|	vips_sum_get_type();
  806|      2|	vips_subtract_get_type();
  807|      2|	vips_multiply_get_type();
  808|      2|	vips_divide_get_type();
  809|      2|	vips_invert_get_type();
  810|      2|	vips_avg_get_type();
  811|      2|	vips_min_get_type();
  812|      2|	vips_max_get_type();
  813|      2|	vips_deviate_get_type();
  814|      2|	vips_linear_get_type();
  815|      2|	vips_math_get_type();
  816|      2|	vips_abs_get_type();
  817|      2|	vips_sign_get_type();
  818|      2|	vips_stats_get_type();
  819|      2|	vips_hist_find_get_type();
  820|      2|	vips_hist_find_ndim_get_type();
  821|      2|	vips_hist_find_indexed_get_type();
  822|      2|	vips_hough_line_get_type();
  823|      2|	vips_hough_circle_get_type();
  824|      2|	vips_project_get_type();
  825|      2|	vips_profile_get_type();
  826|      2|	vips_measure_get_type();
  827|      2|	vips_getpoint_get_type();
  828|      2|	vips_round_get_type();
  829|      2|	vips_relational_get_type();
  830|      2|	vips_relational_const_get_type();
  831|      2|	vips_remainder_get_type();
  832|      2|	vips_remainder_const_get_type();
  833|      2|	vips_boolean_get_type();
  834|      2|	vips_boolean_const_get_type();
  835|      2|	vips_math2_get_type();
  836|      2|	vips_math2_const_get_type();
  837|      2|	vips_complex_get_type();
  838|      2|	vips_complex2_get_type();
  839|      2|	vips_complexget_get_type();
  840|      2|	vips_complexform_get_type();
  841|      2|	vips_find_trim_get_type();
  842|      2|}
arithmetic.c:vips_arithmetic_class_init:
  716|      1|{
  717|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  718|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  719|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  720|       |
  721|      1|	gobject_class->set_property = vips_object_set_property;
  722|      1|	gobject_class->get_property = vips_object_get_property;
  723|       |
  724|      1|	vobject_class->nickname = "arithmetic";
  725|      1|	vobject_class->description = _("arithmetic operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  726|      1|	vobject_class->build = vips_arithmetic_build;
  727|       |
  728|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  729|       |
  730|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  731|      1|		_("Output"),
  732|      1|		_("Output image"),
  733|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  734|      1|		G_STRUCT_OFFSET(VipsArithmetic, out));
  735|      1|}
arithmetic.c:vips_arithmetic_build:
  644|  9.24k|{
  645|  9.24k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  9.24k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  9.24k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  9.24k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  646|  9.24k|	VipsArithmetic *arithmetic = VIPS_ARITHMETIC(object);
  ------------------
  |  |   42|  9.24k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  9.24k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  9.24k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  9.24k|		VIPS_TYPE_ARITHMETIC, VipsArithmetic))
  ------------------
  647|  9.24k|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_GET_CLASS(arithmetic);
  ------------------
  |  |   52|  9.24k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  9.24k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  9.24k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|  9.24k|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  648|       |
  649|  9.24k|	VipsImage **decode;
  650|  9.24k|	VipsImage **format;
  651|  9.24k|	VipsImage **band;
  652|  9.24k|	VipsImage **size;
  653|  9.24k|	int i;
  654|       |
  655|       |#ifdef DEBUG
  656|       |	printf("vips_arithmetic_build: ");
  657|       |	vips_object_print_name(object);
  658|       |	printf("\n");
  659|       |#endif /*DEBUG*/
  660|       |
  661|  9.24k|	if (VIPS_OBJECT_CLASS(vips_arithmetic_parent_class)->build(object))
  ------------------
  |  |  435|  9.24k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  9.24k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  9.24k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (661:6): [True: 0, False: 9.24k]
  ------------------
  662|      0|		return -1;
  663|       |
  664|  9.24k|	g_object_set(arithmetic, "out", vips_image_new(), NULL);
  665|       |
  666|  9.24k|	decode = (VipsImage **)
  667|  9.24k|		vips_object_local_array(object, arithmetic->n);
  668|  9.24k|	format = (VipsImage **)
  669|  9.24k|		vips_object_local_array(object, arithmetic->n);
  670|  9.24k|	band = (VipsImage **)
  671|  9.24k|		vips_object_local_array(object, arithmetic->n);
  672|  9.24k|	size = (VipsImage **)
  673|  9.24k|		vips_object_local_array(object, arithmetic->n);
  674|       |
  675|       |	/* Decode RAD/LABQ etc.
  676|       |	 */
  677|  18.4k|	for (i = 0; i < arithmetic->n; i++)
  ------------------
  |  Branch (677:14): [True: 9.24k, False: 9.24k]
  ------------------
  678|  9.24k|		if (vips_image_decode(arithmetic->in[i], &decode[i]))
  ------------------
  |  Branch (678:7): [True: 0, False: 9.24k]
  ------------------
  679|      0|			return -1;
  680|       |
  681|       |	/* Cast our input images up to a common format, bands and size.
  682|       |	 */
  683|  9.24k|	if (vips__formatalike_vec(decode, format, arithmetic->n) ||
  ------------------
  |  Branch (683:6): [True: 0, False: 9.24k]
  ------------------
  684|  9.24k|		vips__bandalike_vec(class->nickname,
  ------------------
  |  Branch (684:3): [True: 0, False: 9.24k]
  ------------------
  685|  9.24k|			format, band, arithmetic->n, arithmetic->base_bands) ||
  686|  9.24k|		vips__sizealike_vec(band, size, arithmetic->n))
  ------------------
  |  Branch (686:3): [True: 0, False: 9.24k]
  ------------------
  687|      0|		return -1;
  688|       |
  689|       |	/* Keep a copy of the processed images here for subclasses.
  690|       |	 */
  691|  9.24k|	arithmetic->ready = size;
  692|       |
  693|  9.24k|	if (vips_image_pipeline_array(arithmetic->out,
  ------------------
  |  Branch (693:6): [True: 0, False: 9.24k]
  ------------------
  694|  9.24k|			VIPS_DEMAND_STYLE_THINSTRIP, arithmetic->ready))
  695|      0|		return -1;
  696|       |
  697|  9.24k|	arithmetic->out->Bands = arithmetic->ready[0]->Bands;
  698|  9.24k|	if (arithmetic->format != VIPS_FORMAT_NOTSET)
  ------------------
  |  Branch (698:6): [True: 0, False: 9.24k]
  ------------------
  699|      0|		arithmetic->out->BandFmt = arithmetic->format;
  700|  9.24k|	else
  701|  9.24k|		arithmetic->out->BandFmt =
  702|  9.24k|			aclass->format_table[arithmetic->ready[0]->BandFmt];
  703|       |
  704|  9.24k|	if (vips_image_generate(arithmetic->out,
  ------------------
  |  Branch (704:6): [True: 0, False: 9.24k]
  ------------------
  705|  9.24k|			vips_arithmetic_start,
  706|  9.24k|			vips_arithmetic_gen,
  707|  9.24k|			vips_arithmetic_stop,
  708|  9.24k|			arithmetic->ready, arithmetic))
  709|      0|		return -1;
  710|       |
  711|  9.24k|	return 0;
  712|  9.24k|}
arithmetic.c:vips_arithmetic_start:
  557|  9.24k|{
  558|  9.24k|	VipsImage **in = (VipsImage **) a;
  559|  9.24k|	VipsArithmetic *arithmetic = (VipsArithmetic *) b;
  560|       |
  561|  9.24k|	VipsArithmeticSequence *seq;
  562|  9.24k|	int i, n;
  563|       |
  564|  9.24k|	if (!(seq = VIPS_NEW(NULL, VipsArithmeticSequence)))
  ------------------
  |  |   70|  9.24k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  9.24k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  9.24k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  9.24k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  9.24k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (564:6): [True: 0, False: 9.24k]
  ------------------
  565|      0|		return NULL;
  566|       |
  567|  9.24k|	seq->arithmetic = arithmetic;
  568|  9.24k|	seq->ir = NULL;
  569|  9.24k|	seq->p = NULL;
  570|       |
  571|       |	/* How many images?
  572|       |	 */
  573|  18.4k|	for (n = 0; in[n]; n++)
  ------------------
  |  Branch (573:14): [True: 9.24k, False: 9.24k]
  ------------------
  574|  9.24k|		;
  575|       |
  576|       |	/* Allocate space for region array.
  577|       |	 */
  578|  9.24k|	if (!(seq->ir = VIPS_ARRAY(NULL, n + 1, VipsRegion *))) {
  ------------------
  |  |   72|  9.24k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  9.24k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  9.24k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  9.24k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  9.24k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (578:6): [True: 0, False: 9.24k]
  ------------------
  579|      0|		vips_arithmetic_stop(seq, NULL, NULL);
  580|      0|		return NULL;
  581|      0|	}
  582|       |
  583|       |	/* Create a set of regions.
  584|       |	 */
  585|  18.4k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (585:14): [True: 9.24k, False: 9.24k]
  ------------------
  586|  9.24k|		if (!(seq->ir[i] = vips_region_new(in[i]))) {
  ------------------
  |  Branch (586:7): [True: 0, False: 9.24k]
  ------------------
  587|      0|			vips_arithmetic_stop(seq, NULL, NULL);
  588|      0|			return NULL;
  589|      0|		}
  590|  9.24k|	seq->ir[n] = NULL;
  591|       |
  592|       |	/* Input pointers.
  593|       |	 */
  594|  9.24k|	if (!(seq->p = VIPS_ARRAY(NULL, n + 1, VipsPel *))) {
  ------------------
  |  |   72|  9.24k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  9.24k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  9.24k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  9.24k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  9.24k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (594:6): [True: 0, False: 9.24k]
  ------------------
  595|      0|		vips_arithmetic_stop(seq, NULL, NULL);
  596|      0|		return NULL;
  597|      0|	}
  598|       |
  599|  9.24k|	return seq;
  600|  9.24k|}
arithmetic.c:vips_arithmetic_gen:
  605|  9.56k|{
  606|  9.56k|	VipsArithmeticSequence *seq = (VipsArithmeticSequence *) vseq;
  607|  9.56k|	VipsRegion **ir = seq->ir;
  608|  9.56k|	VipsArithmetic *arithmetic = VIPS_ARITHMETIC(b);
  ------------------
  |  |   42|  9.56k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  9.56k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  9.56k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  9.56k|		VIPS_TYPE_ARITHMETIC, VipsArithmetic))
  ------------------
  609|  9.56k|	VipsArithmeticClass *class = VIPS_ARITHMETIC_GET_CLASS(arithmetic);
  ------------------
  |  |   52|  9.56k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  9.56k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  9.56k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|  9.56k|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  610|  9.56k|	VipsRect *r = &out_region->valid;
  611|       |
  612|  9.56k|	VipsPel *q;
  613|  9.56k|	int i, y;
  614|       |
  615|       |	/* Prepare all input regions and make buffer pointers.
  616|       |	 */
  617|  9.56k|	if (vips_reorder_prepare_many(out_region->im, ir, r))
  ------------------
  |  Branch (617:6): [True: 363, False: 9.19k]
  ------------------
  618|    363|		return -1;
  619|  18.3k|	for (i = 0; ir[i]; i++)
  ------------------
  |  Branch (619:14): [True: 9.19k, False: 9.19k]
  ------------------
  620|  9.19k|		seq->p[i] = (VipsPel *)
  621|  9.19k|			VIPS_REGION_ADDR(ir[i], r->left, r->top);
  ------------------
  |  |  227|  18.3k|	((R)->data + \
  |  |  228|  18.3k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  9.19k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  18.3k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  9.19k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  9.19k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  9.19k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  622|  9.19k|	seq->p[i] = NULL;
  623|  9.19k|	q = (VipsPel *) VIPS_REGION_ADDR(out_region, r->left, r->top);
  ------------------
  |  |  227|  9.19k|	((R)->data + \
  |  |  228|  9.19k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  9.19k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  9.19k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  9.19k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  9.19k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  9.19k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  624|       |
  625|  9.19k|	VIPS_GATE_START("vips_arithmetic_gen: work");
  ------------------
  |  |   41|  9.19k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.19k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  9.19k|	{ \
  |  |   43|  9.19k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 9.19k]
  |  |  ------------------
  |  |   44|  9.19k|			vips__thread_gate_start(NAME); \
  |  |   45|  9.19k|	} \
  |  |   46|  9.19k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.19k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  626|       |
  627|  24.0k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (627:14): [True: 14.8k, False: 9.19k]
  ------------------
  628|  14.8k|		class->process_line(arithmetic, q, seq->p, r->width);
  629|       |
  630|  29.7k|		for (i = 0; ir[i]; i++)
  ------------------
  |  Branch (630:15): [True: 14.8k, False: 14.8k]
  ------------------
  631|  14.8k|			seq->p[i] += VIPS_REGION_LSKIP(ir[i]);
  ------------------
  |  |  195|  14.8k|	((size_t) ((R)->bpl))
  ------------------
  632|  14.8k|		q += VIPS_REGION_LSKIP(out_region);
  ------------------
  |  |  195|  14.8k|	((size_t) ((R)->bpl))
  ------------------
  633|  14.8k|	}
  634|       |
  635|  9.19k|	VIPS_GATE_STOP("vips_arithmetic_gen: work");
  ------------------
  |  |   49|  9.19k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.19k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  9.19k|	{ \
  |  |   51|  9.19k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 9.19k]
  |  |  ------------------
  |  |   52|  9.19k|			vips__thread_gate_stop(NAME); \
  |  |   53|  9.19k|	} \
  |  |   54|  9.19k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.19k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  636|       |
  637|  9.19k|	VIPS_COUNT_PIXELS(out_region, VIPS_OBJECT_CLASS(class)->nickname);
  ------------------
  |  |  189|  9.19k|#define VIPS_COUNT_PIXELS(R, N) vips__region_count_pixels(R, N)
  ------------------
  638|       |
  639|  9.19k|	return 0;
  640|  9.56k|}
arithmetic.c:vips_arithmetic_stop:
  537|  9.24k|{
  538|  9.24k|	VipsArithmeticSequence *seq = (VipsArithmeticSequence *) vseq;
  539|       |
  540|  9.24k|	if (seq->ir) {
  ------------------
  |  Branch (540:6): [True: 9.24k, False: 0]
  ------------------
  541|  9.24k|		int i;
  542|       |
  543|  18.4k|		for (i = 0; seq->ir[i]; i++)
  ------------------
  |  Branch (543:15): [True: 9.24k, False: 9.24k]
  ------------------
  544|  9.24k|			VIPS_UNREF(seq->ir[i]);
  ------------------
  |  |   57|  9.24k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  9.24k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  9.24k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  9.24k|	{ \
  |  |  |  |   43|  9.24k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 9.24k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  9.24k|			(void) F((S)); \
  |  |  |  |   45|  9.24k|			(S) = 0; \
  |  |  |  |   46|  9.24k|		} \
  |  |  |  |   47|  9.24k|	} \
  |  |  |  |   48|  9.24k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  9.24k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  545|  9.24k|		VIPS_FREE(seq->ir);
  ------------------
  |  |   50|  9.24k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  9.24k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  9.24k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  9.24k|	{ \
  |  |  |  |   43|  9.24k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 9.24k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  9.24k|			(void) F((S)); \
  |  |  |  |   45|  9.24k|			(S) = 0; \
  |  |  |  |   46|  9.24k|		} \
  |  |  |  |   47|  9.24k|	} \
  |  |  |  |   48|  9.24k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  9.24k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  546|  9.24k|	}
  547|       |
  548|  9.24k|	VIPS_FREE(seq->p);
  ------------------
  |  |   50|  9.24k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  9.24k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  9.24k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  9.24k|	{ \
  |  |  |  |   43|  9.24k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 9.24k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  9.24k|			(void) F((S)); \
  |  |  |  |   45|  9.24k|			(S) = 0; \
  |  |  |  |   46|  9.24k|		} \
  |  |  |  |   47|  9.24k|	} \
  |  |  |  |   48|  9.24k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  9.24k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  549|       |
  550|  9.24k|	VIPS_FREE(seq);
  ------------------
  |  |   50|  9.24k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  9.24k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  9.24k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  9.24k|	{ \
  |  |  |  |   43|  9.24k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 9.24k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  9.24k|			(void) F((S)); \
  |  |  |  |   45|  9.24k|			(S) = 0; \
  |  |  |  |   46|  9.24k|		} \
  |  |  |  |   47|  9.24k|	} \
  |  |  |  |   48|  9.24k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  9.24k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  551|       |
  552|  9.24k|	return 0;
  553|  9.24k|}
arithmetic.c:vips_arithmetic_init:
  739|  9.24k|{
  740|  9.24k|	arithmetic->base_bands = 1;
  741|  9.24k|	arithmetic->format = VIPS_FORMAT_NOTSET;
  742|  9.24k|}
arithmetic.c:vips_format_common:
  297|  4.58k|{
  298|  4.58k|	if (vips_band_format_iscomplex(a) ||
  ------------------
  |  Branch (298:6): [True: 0, False: 4.58k]
  ------------------
  299|  4.58k|		vips_band_format_iscomplex(b)) {
  ------------------
  |  Branch (299:3): [True: 0, False: 4.58k]
  ------------------
  300|      0|		if (a == VIPS_FORMAT_DPCOMPLEX ||
  ------------------
  |  Branch (300:7): [True: 0, False: 0]
  ------------------
  301|      0|			b == VIPS_FORMAT_DPCOMPLEX)
  ------------------
  |  Branch (301:4): [True: 0, False: 0]
  ------------------
  302|      0|			return VIPS_FORMAT_DPCOMPLEX;
  303|      0|		else
  304|      0|			return VIPS_FORMAT_COMPLEX;
  305|      0|	}
  306|  4.58k|	else if (vips_band_format_isfloat(a) ||
  ------------------
  |  Branch (306:11): [True: 363, False: 4.22k]
  ------------------
  307|  4.58k|		vips_band_format_isfloat(b)) {
  ------------------
  |  Branch (307:3): [True: 0, False: 4.22k]
  ------------------
  308|    363|		if (a == VIPS_FORMAT_DOUBLE ||
  ------------------
  |  Branch (308:7): [True: 0, False: 363]
  ------------------
  309|    363|			b == VIPS_FORMAT_DOUBLE)
  ------------------
  |  Branch (309:4): [True: 0, False: 363]
  ------------------
  310|      0|			return VIPS_FORMAT_DOUBLE;
  311|    363|		else
  312|    363|			return VIPS_FORMAT_FLOAT;
  313|    363|	}
  314|  4.22k|	else
  315|  4.22k|		return format_largest[a][b];
  316|  4.58k|}

avg.c:vips_avg_class_init:
  218|      1|{
  219|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  220|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  221|      1|	VipsStatisticClass *sclass = VIPS_STATISTIC_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  222|       |
  223|      1|	gobject_class->set_property = vips_object_set_property;
  224|      1|	gobject_class->get_property = vips_object_get_property;
  225|       |
  226|      1|	object_class->nickname = "avg";
  227|      1|	object_class->description = _("find image average");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  228|      1|	object_class->build = vips_avg_build;
  229|       |
  230|      1|	sclass->start = vips_avg_start;
  231|      1|	sclass->scan = vips_avg_scan;
  232|      1|	sclass->stop = vips_avg_stop;
  233|       |
  234|      1|	VIPS_ARG_DOUBLE(class, "out", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  235|      1|		_("Output"),
  236|      1|		_("Output value"),
  237|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  238|      1|		G_STRUCT_OFFSET(VipsAvg, out),
  239|      1|		-INFINITY, INFINITY, 0.0);
  240|      1|}

binary.c:vips_binary_class_init:
   81|      1|{
   82|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   83|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   84|       |
   85|      1|	gobject_class->set_property = vips_object_set_property;
   86|      1|	gobject_class->get_property = vips_object_get_property;
   87|       |
   88|      1|	vobject_class->nickname = "binary";
   89|      1|	vobject_class->description = _("binary operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   90|      1|	vobject_class->build = vips_binary_build;
   91|       |
   92|       |	/* Create properties.
   93|       |	 */
   94|       |
   95|      1|	VIPS_ARG_IMAGE(class, "left", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
   96|      1|		_("Left"),
   97|      1|		_("Left-hand image argument"),
   98|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
   99|      1|		G_STRUCT_OFFSET(VipsBinary, left));
  100|       |
  101|      1|	VIPS_ARG_IMAGE(class, "right", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  102|      1|		_("Right"),
  103|      1|		_("Right-hand image argument"),
  104|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  105|      1|		G_STRUCT_OFFSET(VipsBinary, right));
  106|      1|}

vips_rshift_const1:
  956|    494|{
  957|    494|	va_list ap;
  958|    494|	int result;
  959|       |
  960|    494|	va_start(ap, c);
  961|    494|	result = vips_boolean_constv(in, out,
  962|    494|		VIPS_OPERATION_BOOLEAN_RSHIFT, &c, 1, ap);
  963|    494|	va_end(ap);
  964|       |
  965|    494|	return result;
  966|    494|}
boolean.c:vips_boolean_class_init:
  260|      1|{
  261|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  262|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  263|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  264|       |
  265|      1|	gobject_class->set_property = vips_object_set_property;
  266|      1|	gobject_class->get_property = vips_object_get_property;
  267|       |
  268|      1|	object_class->nickname = "boolean";
  269|      1|	object_class->description = _("boolean operation on two images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  270|      1|	object_class->build = vips_boolean_build;
  271|       |
  272|      1|	aclass->process_line = vips_boolean_buffer;
  273|       |
  274|      1|	vips_arithmetic_set_format_table(aclass, vips_boolean_format_table);
  275|       |
  276|      1|	VIPS_ARG_ENUM(class, "boolean", 200,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  277|      1|		_("Operation"),
  278|      1|		_("Boolean to perform"),
  279|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  280|      1|		G_STRUCT_OFFSET(VipsBoolean, operation),
  281|      1|		VIPS_TYPE_OPERATION_BOOLEAN,
  282|      1|		VIPS_OPERATION_BOOLEAN_AND);
  283|      1|}
boolean.c:vips_boolean_const_class_init:
  559|      1|{
  560|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  561|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  562|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  563|       |
  564|      1|	gobject_class->set_property = vips_object_set_property;
  565|      1|	gobject_class->get_property = vips_object_get_property;
  566|       |
  567|      1|	object_class->nickname = "boolean_const";
  568|      1|	object_class->description =
  569|      1|		_("boolean operations against a constant");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  570|      1|	object_class->build = vips_boolean_const_build;
  571|       |
  572|      1|	aclass->process_line = vips_boolean_const_buffer;
  573|       |
  574|      1|	vips_arithmetic_set_format_table(aclass, vips_boolean_format_table);
  575|       |
  576|      1|	VIPS_ARG_ENUM(class, "boolean", 200,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  577|      1|		_("Operation"),
  578|      1|		_("Boolean to perform"),
  579|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  580|      1|		G_STRUCT_OFFSET(VipsBooleanConst, operation),
  581|      1|		VIPS_TYPE_OPERATION_BOOLEAN,
  582|      1|		VIPS_OPERATION_BOOLEAN_AND);
  583|      1|}
boolean.c:vips_boolean_const_build:
  484|    494|{
  485|    494|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    494|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    494|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    494|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  486|    494|	VipsUnary *unary = (VipsUnary *) object;
  487|       |
  488|    494|	if (unary->in &&
  ------------------
  |  Branch (488:6): [True: 494, False: 0]
  ------------------
  489|    494|		vips_check_noncomplex(class->nickname, unary->in))
  ------------------
  |  Branch (489:3): [True: 0, False: 494]
  ------------------
  490|      0|		return -1;
  491|       |
  492|    494|	if (VIPS_OBJECT_CLASS(vips_boolean_const_parent_class)->build(object))
  ------------------
  |  |  435|    494|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    494|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    494|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (492:6): [True: 0, False: 494]
  ------------------
  493|      0|		return -1;
  494|       |
  495|    494|	return 0;
  496|    494|}
boolean.c:vips_boolean_const_buffer:
  523|  6.13k|{
  524|  6.13k|	VipsUnaryConst *uconst = (VipsUnaryConst *) arithmetic;
  525|  6.13k|	VipsBooleanConst *bconst = (VipsBooleanConst *) arithmetic;
  526|  6.13k|	VipsImage *im = arithmetic->ready[0];
  527|  6.13k|	int bands = im->Bands;
  528|       |
  529|  6.13k|	int i, x, b;
  530|       |
  531|  6.13k|	switch (bconst->operation) {
  532|      0|	case VIPS_OPERATION_BOOLEAN_AND:
  ------------------
  |  Branch (532:2): [True: 0, False: 6.13k]
  ------------------
  533|      0|		SWITCH(LOOPC, FLOOPC, &);
  ------------------
  |  |  132|      0|	switch (vips_image_get_format(im)) { \
  |  |  133|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		I(unsigned char, OP); \
  |  |  ------------------
  |  |  |  |  533|      0|		SWITCH(LOOPC, FLOOPC, &);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		I(signed char, OP); \
  |  |  ------------------
  |  |  |  |  533|      0|		SWITCH(LOOPC, FLOOPC, &);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		I(unsigned short, OP); \
  |  |  ------------------
  |  |  |  |  533|      0|		SWITCH(LOOPC, FLOOPC, &);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		I(signed short, OP); \
  |  |  ------------------
  |  |  |  |  533|      0|		SWITCH(LOOPC, FLOOPC, &);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		I(unsigned int, OP); \
  |  |  ------------------
  |  |  |  |  533|      0|		SWITCH(LOOPC, FLOOPC, &);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (148:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  149|      0|		I(signed int, OP); \
  |  |  ------------------
  |  |  |  |  533|      0|		SWITCH(LOOPC, FLOOPC, &);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  150|      0|		break; \
  |  |  151|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (151:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  152|      0|		F(float, OP); \
  |  |  ------------------
  |  |  |  |  533|      0|		SWITCH(LOOPC, FLOOPC, &);
  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|	{ \
  |  |  |  |  |  |  511|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  512|      0|		int *restrict q = (int *) out; \
  |  |  |  |  |  |  513|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  514|      0|\
  |  |  |  |  |  |  515|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (515:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  516|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (516:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  517|      0|				q[i] = ((int) p[i]) OP((int) c[b]); \
  |  |  |  |  |  |  518|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  153|      0|		break; \
  |  |  154|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (154:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  155|      0|		F(double, OP); \
  |  |  ------------------
  |  |  |  |  533|      0|		SWITCH(LOOPC, FLOOPC, &);
  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|	{ \
  |  |  |  |  |  |  511|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  512|      0|		int *restrict q = (int *) out; \
  |  |  |  |  |  |  513|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  514|      0|\
  |  |  |  |  |  |  515|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (515:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  516|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (516:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  517|      0|				q[i] = ((int) p[i]) OP((int) c[b]); \
  |  |  |  |  |  |  518|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  156|      0|		break; \
  |  |  157|      0|\
  |  |  158|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (158:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  159|      0|		g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  160|      0|	}
  ------------------
  534|      0|		break;
  535|       |
  536|      0|	case VIPS_OPERATION_BOOLEAN_OR:
  ------------------
  |  Branch (536:2): [True: 0, False: 6.13k]
  ------------------
  537|      0|		SWITCH(LOOPC, FLOOPC, |);
  ------------------
  |  |  132|      0|	switch (vips_image_get_format(im)) { \
  |  |  133|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		I(unsigned char, OP); \
  |  |  ------------------
  |  |  |  |  537|      0|		SWITCH(LOOPC, FLOOPC, |);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		I(signed char, OP); \
  |  |  ------------------
  |  |  |  |  537|      0|		SWITCH(LOOPC, FLOOPC, |);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		I(unsigned short, OP); \
  |  |  ------------------
  |  |  |  |  537|      0|		SWITCH(LOOPC, FLOOPC, |);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		I(signed short, OP); \
  |  |  ------------------
  |  |  |  |  537|      0|		SWITCH(LOOPC, FLOOPC, |);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		I(unsigned int, OP); \
  |  |  ------------------
  |  |  |  |  537|      0|		SWITCH(LOOPC, FLOOPC, |);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (148:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  149|      0|		I(signed int, OP); \
  |  |  ------------------
  |  |  |  |  537|      0|		SWITCH(LOOPC, FLOOPC, |);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  150|      0|		break; \
  |  |  151|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (151:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  152|      0|		F(float, OP); \
  |  |  ------------------
  |  |  |  |  537|      0|		SWITCH(LOOPC, FLOOPC, |);
  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|	{ \
  |  |  |  |  |  |  511|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  512|      0|		int *restrict q = (int *) out; \
  |  |  |  |  |  |  513|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  514|      0|\
  |  |  |  |  |  |  515|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (515:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  516|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (516:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  517|      0|				q[i] = ((int) p[i]) OP((int) c[b]); \
  |  |  |  |  |  |  518|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  153|      0|		break; \
  |  |  154|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (154:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  155|      0|		F(double, OP); \
  |  |  ------------------
  |  |  |  |  537|      0|		SWITCH(LOOPC, FLOOPC, |);
  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|	{ \
  |  |  |  |  |  |  511|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  512|      0|		int *restrict q = (int *) out; \
  |  |  |  |  |  |  513|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  514|      0|\
  |  |  |  |  |  |  515|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (515:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  516|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (516:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  517|      0|				q[i] = ((int) p[i]) OP((int) c[b]); \
  |  |  |  |  |  |  518|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  156|      0|		break; \
  |  |  157|      0|\
  |  |  158|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (158:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  159|      0|		g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  160|      0|	}
  ------------------
  538|      0|		break;
  539|       |
  540|      0|	case VIPS_OPERATION_BOOLEAN_EOR:
  ------------------
  |  Branch (540:2): [True: 0, False: 6.13k]
  ------------------
  541|      0|		SWITCH(LOOPC, FLOOPC, ^);
  ------------------
  |  |  132|      0|	switch (vips_image_get_format(im)) { \
  |  |  133|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		I(unsigned char, OP); \
  |  |  ------------------
  |  |  |  |  541|      0|		SWITCH(LOOPC, FLOOPC, ^);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		I(signed char, OP); \
  |  |  ------------------
  |  |  |  |  541|      0|		SWITCH(LOOPC, FLOOPC, ^);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		I(unsigned short, OP); \
  |  |  ------------------
  |  |  |  |  541|      0|		SWITCH(LOOPC, FLOOPC, ^);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		I(signed short, OP); \
  |  |  ------------------
  |  |  |  |  541|      0|		SWITCH(LOOPC, FLOOPC, ^);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		I(unsigned int, OP); \
  |  |  ------------------
  |  |  |  |  541|      0|		SWITCH(LOOPC, FLOOPC, ^);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (148:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  149|      0|		I(signed int, OP); \
  |  |  ------------------
  |  |  |  |  541|      0|		SWITCH(LOOPC, FLOOPC, ^);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  150|      0|		break; \
  |  |  151|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (151:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  152|      0|		F(float, OP); \
  |  |  ------------------
  |  |  |  |  541|      0|		SWITCH(LOOPC, FLOOPC, ^);
  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|	{ \
  |  |  |  |  |  |  511|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  512|      0|		int *restrict q = (int *) out; \
  |  |  |  |  |  |  513|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  514|      0|\
  |  |  |  |  |  |  515|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (515:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  516|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (516:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  517|      0|				q[i] = ((int) p[i]) OP((int) c[b]); \
  |  |  |  |  |  |  518|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  153|      0|		break; \
  |  |  154|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (154:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  155|      0|		F(double, OP); \
  |  |  ------------------
  |  |  |  |  541|      0|		SWITCH(LOOPC, FLOOPC, ^);
  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|	{ \
  |  |  |  |  |  |  511|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  512|      0|		int *restrict q = (int *) out; \
  |  |  |  |  |  |  513|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  514|      0|\
  |  |  |  |  |  |  515|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (515:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  516|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (516:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  517|      0|				q[i] = ((int) p[i]) OP((int) c[b]); \
  |  |  |  |  |  |  518|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  156|      0|		break; \
  |  |  157|      0|\
  |  |  158|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (158:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  159|      0|		g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  160|      0|	}
  ------------------
  542|      0|		break;
  543|       |
  544|      0|	case VIPS_OPERATION_BOOLEAN_LSHIFT:
  ------------------
  |  Branch (544:2): [True: 0, False: 6.13k]
  ------------------
  545|      0|		SWITCH(LOOPC, FLOOPC, <<);
  ------------------
  |  |  132|      0|	switch (vips_image_get_format(im)) { \
  |  |  133|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		I(unsigned char, OP); \
  |  |  ------------------
  |  |  |  |  545|      0|		SWITCH(LOOPC, FLOOPC, <<);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		I(signed char, OP); \
  |  |  ------------------
  |  |  |  |  545|      0|		SWITCH(LOOPC, FLOOPC, <<);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		I(unsigned short, OP); \
  |  |  ------------------
  |  |  |  |  545|      0|		SWITCH(LOOPC, FLOOPC, <<);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		I(signed short, OP); \
  |  |  ------------------
  |  |  |  |  545|      0|		SWITCH(LOOPC, FLOOPC, <<);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		I(unsigned int, OP); \
  |  |  ------------------
  |  |  |  |  545|      0|		SWITCH(LOOPC, FLOOPC, <<);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (148:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  149|      0|		I(signed int, OP); \
  |  |  ------------------
  |  |  |  |  545|      0|		SWITCH(LOOPC, FLOOPC, <<);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  150|      0|		break; \
  |  |  151|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (151:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  152|      0|		F(float, OP); \
  |  |  ------------------
  |  |  |  |  545|      0|		SWITCH(LOOPC, FLOOPC, <<);
  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|	{ \
  |  |  |  |  |  |  511|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  512|      0|		int *restrict q = (int *) out; \
  |  |  |  |  |  |  513|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  514|      0|\
  |  |  |  |  |  |  515|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (515:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  516|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (516:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  517|      0|				q[i] = ((int) p[i]) OP((int) c[b]); \
  |  |  |  |  |  |  518|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  153|      0|		break; \
  |  |  154|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (154:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  155|      0|		F(double, OP); \
  |  |  ------------------
  |  |  |  |  545|      0|		SWITCH(LOOPC, FLOOPC, <<);
  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|	{ \
  |  |  |  |  |  |  511|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  512|      0|		int *restrict q = (int *) out; \
  |  |  |  |  |  |  513|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  514|      0|\
  |  |  |  |  |  |  515|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (515:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  516|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (516:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  517|      0|				q[i] = ((int) p[i]) OP((int) c[b]); \
  |  |  |  |  |  |  518|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  156|      0|		break; \
  |  |  157|      0|\
  |  |  158|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (158:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  159|      0|		g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  160|      0|	}
  ------------------
  546|      0|		break;
  547|       |
  548|  6.13k|	case VIPS_OPERATION_BOOLEAN_RSHIFT:
  ------------------
  |  Branch (548:2): [True: 6.13k, False: 0]
  ------------------
  549|  6.13k|		SWITCH(LOOPC, FLOOPC, >>);
  ------------------
  |  |  132|  6.13k|	switch (vips_image_get_format(im)) { \
  |  |  133|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 6.13k]
  |  |  ------------------
  |  |  134|      0|		I(unsigned char, OP); \
  |  |  ------------------
  |  |  |  |  549|      0|		SWITCH(LOOPC, FLOOPC, >>);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 6.13k]
  |  |  ------------------
  |  |  137|      0|		I(signed char, OP); \
  |  |  ------------------
  |  |  |  |  549|      0|		SWITCH(LOOPC, FLOOPC, >>);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|  6.13k|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 6.13k, False: 0]
  |  |  ------------------
  |  |  140|  6.13k|		I(unsigned short, OP); \
  |  |  ------------------
  |  |  |  |  549|  6.13k|		SWITCH(LOOPC, FLOOPC, >>);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|  6.13k|	{ \
  |  |  |  |  |  |  500|  6.13k|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|  6.13k|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|  6.13k|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|  6.13k|\
  |  |  |  |  |  |  504|   376k|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 370k, False: 6.13k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|  1.67M|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 1.30M, False: 370k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|  1.30M|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|  6.13k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|  6.13k|		break; \
  |  |  142|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 6.13k]
  |  |  ------------------
  |  |  143|      0|		I(signed short, OP); \
  |  |  ------------------
  |  |  |  |  549|      0|		SWITCH(LOOPC, FLOOPC, >>);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 6.13k]
  |  |  ------------------
  |  |  146|      0|		I(unsigned int, OP); \
  |  |  ------------------
  |  |  |  |  549|      0|		SWITCH(LOOPC, FLOOPC, >>);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (148:2): [True: 0, False: 6.13k]
  |  |  ------------------
  |  |  149|      0|		I(signed int, OP); \
  |  |  ------------------
  |  |  |  |  549|      0|		SWITCH(LOOPC, FLOOPC, >>);
  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|	{ \
  |  |  |  |  |  |  500|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  501|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  |  |  |  |  502|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  503|      0|\
  |  |  |  |  |  |  504|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (504:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  505|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (505:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  506|      0|				q[i] = p[i] OP c[b]; \
  |  |  |  |  |  |  507|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  150|      0|		break; \
  |  |  151|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (151:2): [True: 0, False: 6.13k]
  |  |  ------------------
  |  |  152|      0|		F(float, OP); \
  |  |  ------------------
  |  |  |  |  549|      0|		SWITCH(LOOPC, FLOOPC, >>);
  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|	{ \
  |  |  |  |  |  |  511|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  512|      0|		int *restrict q = (int *) out; \
  |  |  |  |  |  |  513|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  514|      0|\
  |  |  |  |  |  |  515|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (515:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  516|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (516:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  517|      0|				q[i] = ((int) p[i]) OP((int) c[b]); \
  |  |  |  |  |  |  518|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  153|      0|		break; \
  |  |  154|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (154:2): [True: 0, False: 6.13k]
  |  |  ------------------
  |  |  155|      0|		F(double, OP); \
  |  |  ------------------
  |  |  |  |  549|      0|		SWITCH(LOOPC, FLOOPC, >>);
  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|	{ \
  |  |  |  |  |  |  511|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  512|      0|		int *restrict q = (int *) out; \
  |  |  |  |  |  |  513|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  514|      0|\
  |  |  |  |  |  |  515|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (515:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  516|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (516:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  517|      0|				q[i] = ((int) p[i]) OP((int) c[b]); \
  |  |  |  |  |  |  518|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  156|      0|		break; \
  |  |  157|      0|\
  |  |  158|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (158:2): [True: 0, False: 6.13k]
  |  |  ------------------
  |  |  159|      0|		g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  160|  6.13k|	}
  ------------------
  550|  6.13k|		break;
  551|       |
  552|      0|	default:
  ------------------
  |  Branch (552:2): [True: 0, False: 6.13k]
  ------------------
  553|      0|		g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  554|  6.13k|	}
  555|  6.13k|}
boolean.c:vips_boolean_const_init:
  587|    494|{
  588|    494|}
boolean.c:vips_boolean_constv:
  593|    494|{
  594|    494|	VipsArea *area_c;
  595|    494|	double *array;
  596|    494|	int result;
  597|    494|	int i;
  598|       |
  599|    494|	area_c = vips_area_new_array(G_TYPE_DOUBLE, sizeof(double), n);
  ------------------
  |  |  148|    494|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|    494|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|    494|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  600|    494|	array = (double *) area_c->data;
  601|    988|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (601:14): [True: 494, False: 494]
  ------------------
  602|    494|		array[i] = c[i];
  603|       |
  604|    494|	result = vips_call_split("boolean_const", ap,
  605|    494|		in, out, operation, area_c);
  606|       |
  607|    494|	vips_area_unref(area_c);
  608|       |
  609|    494|	return result;
  610|    494|}

clamp.c:vips_clamp_class_init:
  146|      1|{
  147|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  148|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  149|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  150|       |
  151|      1|	gobject_class->set_property = vips_object_set_property;
  152|      1|	gobject_class->get_property = vips_object_get_property;
  153|       |
  154|      1|	object_class->nickname = "clamp";
  155|      1|	object_class->description = _("clamp values of an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  156|       |
  157|      1|	aclass->process_line = vips_clamp_buffer;
  158|       |
  159|      1|	vips_arithmetic_set_format_table(aclass, vips_clamp_format_table);
  160|       |
  161|      1|	VIPS_ARG_DOUBLE(class, "min", 10,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  162|      1|		_("Min"),
  163|      1|		_("Minimum value"),
  164|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  165|      1|		G_STRUCT_OFFSET(VipsClamp, min),
  166|      1|		-INFINITY, INFINITY, 0.0);
  167|       |
  168|      1|	VIPS_ARG_DOUBLE(class, "max", 11,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  169|      1|		_("Max"),
  170|      1|		_("Maximum value"),
  171|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  172|      1|		G_STRUCT_OFFSET(VipsClamp, max),
  173|      1|		-INFINITY, INFINITY, 1.0);
  174|      1|}

complex.c:vips_complex_class_init:
  241|      1|{
  242|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  243|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  244|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  245|       |
  246|      1|	gobject_class->set_property = vips_object_set_property;
  247|      1|	gobject_class->get_property = vips_object_get_property;
  248|       |
  249|      1|	object_class->nickname = "complex";
  250|      1|	object_class->description =
  251|      1|		_("perform a complex operation on an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  252|       |
  253|      1|	aclass->process_line = vips_complex_buffer;
  254|       |
  255|      1|	vips_arithmetic_set_format_table(aclass, vips_complex_format_table);
  256|       |
  257|      1|	VIPS_ARG_ENUM(class, "cmplx", 200,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  258|      1|		_("Operation"),
  259|      1|		_("Complex to perform"),
  260|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  261|      1|		G_STRUCT_OFFSET(VipsComplex, cmplx),
  262|      1|		VIPS_TYPE_OPERATION_COMPLEX, VIPS_OPERATION_COMPLEX_POLAR);
  263|      1|}
complex.c:vips_complex2_class_init:
  521|      1|{
  522|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  523|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  524|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  525|       |
  526|      1|	gobject_class->set_property = vips_object_set_property;
  527|      1|	gobject_class->get_property = vips_object_get_property;
  528|       |
  529|      1|	object_class->nickname = "complex2";
  530|      1|	object_class->description =
  531|      1|		_("complex binary operations on two images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  532|       |
  533|      1|	aclass->process_line = vips_complex2_buffer;
  534|       |
  535|      1|	vips_arithmetic_set_format_table(aclass, vips_complex2_format_table);
  536|       |
  537|      1|	VIPS_ARG_ENUM(class, "cmplx", 200,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  538|      1|		_("Operation"),
  539|      1|		_("Binary complex operation to perform"),
  540|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  541|      1|		G_STRUCT_OFFSET(VipsComplex2, cmplx),
  542|      1|		VIPS_TYPE_OPERATION_COMPLEX2,
  543|      1|		VIPS_OPERATION_COMPLEX2_CROSS_PHASE);
  544|      1|}
complex.c:vips_complexget_class_init:
  753|      1|{
  754|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  755|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  756|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  757|       |
  758|      1|	gobject_class->set_property = vips_object_set_property;
  759|      1|	gobject_class->get_property = vips_object_get_property;
  760|       |
  761|      1|	object_class->nickname = "complexget";
  762|      1|	object_class->description = _("get a component from a complex image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  763|      1|	object_class->build = vips_complexget_build;
  764|       |
  765|      1|	aclass->process_line = vips_complexget_buffer;
  766|       |
  767|      1|	vips_arithmetic_set_format_table(aclass,
  768|      1|		vips_complexget_format_table);
  769|       |
  770|      1|	VIPS_ARG_ENUM(class, "get", 200,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  771|      1|		_("Operation"),
  772|      1|		_("Complex to perform"),
  773|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  774|      1|		G_STRUCT_OFFSET(VipsComplexget, get),
  775|      1|		VIPS_TYPE_OPERATION_COMPLEXGET,
  776|      1|		VIPS_OPERATION_COMPLEXGET_REAL);
  777|      1|}
complex.c:vips_complexform_class_init:
  972|      1|{
  973|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  974|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  975|       |
  976|      1|	object_class->nickname = "complexform";
  977|      1|	object_class->description =
  978|      1|		_("form a complex image from two real images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  979|      1|	object_class->build = vips_complexform_build;
  980|       |
  981|      1|	aclass->process_line = vips_complexform_buffer;
  982|       |
  983|      1|	vips_arithmetic_set_format_table(aclass,
  984|      1|		vips_complexform_format_table);
  985|      1|}

deviate.c:vips_deviate_class_init:
  220|      1|{
  221|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  222|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  223|      1|	VipsStatisticClass *sclass = VIPS_STATISTIC_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  224|       |
  225|      1|	gobject_class->set_property = vips_object_set_property;
  226|      1|	gobject_class->get_property = vips_object_get_property;
  227|       |
  228|      1|	object_class->nickname = "deviate";
  229|      1|	object_class->description = _("find image standard deviation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  230|      1|	object_class->build = vips_deviate_build;
  231|       |
  232|      1|	sclass->start = vips_deviate_start;
  233|      1|	sclass->scan = vips_deviate_scan;
  234|      1|	sclass->stop = vips_deviate_stop;
  235|       |
  236|      1|	VIPS_ARG_DOUBLE(class, "out", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  237|      1|		_("Output"),
  238|      1|		_("Output value"),
  239|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  240|      1|		G_STRUCT_OFFSET(VipsDeviate, out),
  241|      1|		-INFINITY, INFINITY, 0.0);
  242|      1|}

divide.c:vips_divide_class_init:
  205|      1|{
  206|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  207|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  208|       |
  209|      1|	object_class->nickname = "divide";
  210|      1|	object_class->description = _("divide two images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  211|       |
  212|      1|	aclass->process_line = vips_divide_buffer;
  213|       |
  214|      1|	vips_arithmetic_set_format_table(aclass, vips_divide_format_table);
  215|      1|}

find_trim.c:vips_find_trim_class_init:
  175|      1|{
  176|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  177|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  178|       |
  179|      1|	gobject_class->set_property = vips_object_set_property;
  180|      1|	gobject_class->get_property = vips_object_get_property;
  181|       |
  182|      1|	object_class->nickname = "find_trim";
  183|      1|	object_class->description = _("search an image for non-edge areas");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  184|      1|	object_class->build = vips_find_trim_build;
  185|       |
  186|       |	// operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  187|       |
  188|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  189|      1|		_("Input"),
  190|      1|		_("Image to find_trim"),
  191|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  192|      1|		G_STRUCT_OFFSET(VipsFindTrim, in));
  193|       |
  194|      1|	VIPS_ARG_DOUBLE(class, "threshold", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  195|      1|		_("Threshold"),
  196|      1|		_("Object threshold"),
  197|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  198|      1|		G_STRUCT_OFFSET(VipsFindTrim, threshold),
  199|      1|		0, INFINITY, 10.0);
  200|       |
  201|      1|	VIPS_ARG_BOXED(class, "background", 3,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  202|      1|		_("Background"),
  203|      1|		_("Color for background pixels"),
  204|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  205|      1|		G_STRUCT_OFFSET(VipsFindTrim, background),
  206|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  207|       |
  208|      1|	VIPS_ARG_BOOL(class, "line_art", 4,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  209|      1|		_("Line art mode"),
  210|      1|		_("Enable line art mode"),
  211|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  212|      1|		G_STRUCT_OFFSET(VipsFindTrim, line_art),
  213|      1|		FALSE);
  214|       |
  215|      1|	VIPS_ARG_INT(class, "left", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  216|      1|		_("Left"),
  217|      1|		_("Left edge of image"),
  218|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  219|      1|		G_STRUCT_OFFSET(VipsFindTrim, left),
  220|      1|		0, VIPS_MAX_COORD, 1);
  221|       |
  222|      1|	VIPS_ARG_INT(class, "top", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  223|      1|		_("Top"),
  224|      1|		_("Top edge of extract area"),
  225|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  226|      1|		G_STRUCT_OFFSET(VipsFindTrim, top),
  227|      1|		0, VIPS_MAX_COORD, 0);
  228|       |
  229|      1|	VIPS_ARG_INT(class, "width", 12,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  230|      1|		_("Width"),
  231|      1|		_("Width of extract area"),
  232|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  233|      1|		G_STRUCT_OFFSET(VipsFindTrim, width),
  234|      1|		0, VIPS_MAX_COORD, 1);
  235|       |
  236|      1|	VIPS_ARG_INT(class, "height", 13,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  237|      1|		_("Height"),
  238|      1|		_("Height of extract area"),
  239|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  240|      1|		G_STRUCT_OFFSET(VipsFindTrim, height),
  241|      1|		0, VIPS_MAX_COORD, 1);
  242|      1|}

getpoint.c:vips_getpoint_class_init:
  141|      1|{
  142|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  143|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  144|       |
  145|      1|	gobject_class->set_property = vips_object_set_property;
  146|      1|	gobject_class->get_property = vips_object_get_property;
  147|       |
  148|      1|	object_class->nickname = "getpoint";
  149|      1|	object_class->description = _("read a point from an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  150|      1|	object_class->build = vips_getpoint_build;
  151|       |
  152|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  153|      1|		_("Input"),
  154|      1|		_("Input image"),
  155|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  156|      1|		G_STRUCT_OFFSET(VipsGetpoint, in));
  157|       |
  158|      1|	VIPS_ARG_BOXED(class, "out_array", 2,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  159|      1|		_("Output array"),
  160|      1|		_("Array of output values"),
  161|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  162|      1|		G_STRUCT_OFFSET(VipsGetpoint, out_array),
  163|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  164|       |
  165|      1|	VIPS_ARG_INT(class, "x", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  166|      1|		_("x"),
  167|      1|		_("Point to read"),
  168|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  169|      1|		G_STRUCT_OFFSET(VipsGetpoint, x),
  170|      1|		0, VIPS_MAX_COORD, 0);
  171|       |
  172|      1|	VIPS_ARG_INT(class, "y", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  173|      1|		_("y"),
  174|      1|		_("Point to read"),
  175|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  176|      1|		G_STRUCT_OFFSET(VipsGetpoint, y),
  177|      1|		0, VIPS_MAX_COORD, 0);
  178|       |
  179|      1|	VIPS_ARG_BOOL(class, "unpack_complex", 7,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  180|      1|		_("unpack_complex"),
  181|      1|		_("Complex pixels should be unpacked"),
  182|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  183|      1|		G_STRUCT_OFFSET(VipsGetpoint, unpack_complex),
  184|      1|		FALSE);
  185|      1|}

hist_find.c:vips_hist_find_class_init:
  413|      1|{
  414|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  415|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  416|      1|	VipsStatisticClass *sclass = VIPS_STATISTIC_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  417|       |
  418|      1|	gobject_class->set_property = vips_object_set_property;
  419|      1|	gobject_class->get_property = vips_object_get_property;
  420|       |
  421|      1|	object_class->nickname = "hist_find";
  422|      1|	object_class->description = _("find image histogram");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  423|      1|	object_class->build = vips_hist_find_build;
  424|       |
  425|      1|	sclass->start = vips_hist_find_start;
  426|      1|	sclass->scan = vips_hist_find_scan;
  427|      1|	sclass->stop = vips_hist_find_stop;
  428|      1|	sclass->format_table = vips_hist_find_format_table;
  429|       |
  430|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  431|      1|		_("Output"),
  432|      1|		_("Output histogram"),
  433|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  434|      1|		G_STRUCT_OFFSET(VipsHistFind, out));
  435|       |
  436|      1|	VIPS_ARG_INT(class, "band", 110,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  437|      1|		_("Band"),
  438|      1|		_("Find histogram of band"),
  439|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  440|      1|		G_STRUCT_OFFSET(VipsHistFind, band),
  441|      1|		-1, 100000, -1);
  442|      1|}

hist_find_indexed.c:vips_hist_find_indexed_class_init:
  452|      1|{
  453|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  454|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  455|      1|	VipsStatisticClass *sclass = VIPS_STATISTIC_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  456|       |
  457|      1|	gobject_class->set_property = vips_object_set_property;
  458|      1|	gobject_class->get_property = vips_object_get_property;
  459|       |
  460|      1|	object_class->nickname = "hist_find_indexed";
  461|      1|	object_class->description = _("find indexed image histogram");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  462|      1|	object_class->build = vips_hist_find_indexed_build;
  463|       |
  464|      1|	sclass->start = vips_hist_find_indexed_start;
  465|      1|	sclass->scan = vips_hist_find_indexed_scan;
  466|      1|	sclass->stop = vips_hist_find_indexed_stop;
  467|       |
  468|      1|	VIPS_ARG_IMAGE(class, "index", 90,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  469|      1|		_("Index"),
  470|      1|		_("Index image"),
  471|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  472|      1|		G_STRUCT_OFFSET(VipsHistFindIndexed, index));
  473|       |
  474|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  475|      1|		_("Output"),
  476|      1|		_("Output histogram"),
  477|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  478|      1|		G_STRUCT_OFFSET(VipsHistFindIndexed, out));
  479|       |
  480|      1|	VIPS_ARG_ENUM(class, "combine", 104,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  481|      1|		_("Combine"),
  482|      1|		_("Combine bins like this"),
  483|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  484|      1|		G_STRUCT_OFFSET(VipsHistFindIndexed, combine),
  485|      1|		VIPS_TYPE_COMBINE, VIPS_COMBINE_SUM);
  486|      1|}

hist_find_ndim.c:vips_hist_find_ndim_class_init:
  295|      1|{
  296|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  297|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  298|      1|	VipsStatisticClass *sclass = VIPS_STATISTIC_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  299|       |
  300|      1|	gobject_class->set_property = vips_object_set_property;
  301|      1|	gobject_class->get_property = vips_object_get_property;
  302|       |
  303|      1|	object_class->nickname = "hist_find_ndim";
  304|      1|	object_class->description = _("find n-dimensional image histogram");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  305|      1|	object_class->build = vips_hist_find_ndim_build;
  306|       |
  307|      1|	sclass->start = vips_hist_find_ndim_start;
  308|      1|	sclass->scan = vips_hist_find_ndim_scan;
  309|      1|	sclass->stop = vips_hist_find_ndim_stop;
  310|      1|	sclass->format_table = vips_hist_find_ndim_format_table;
  311|       |
  312|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  313|      1|		_("Output"),
  314|      1|		_("Output histogram"),
  315|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  316|      1|		G_STRUCT_OFFSET(VipsHistFindNDim, out));
  317|       |
  318|      1|	VIPS_ARG_INT(class, "bins", 110,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  319|      1|		_("Bins"),
  320|      1|		_("Number of bins in each dimension"),
  321|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  322|      1|		G_STRUCT_OFFSET(VipsHistFindNDim, bins),
  323|      1|		1, 65536, 10);
  324|      1|}

hough.c:vips_hough_class_init:
  161|      1|{
  162|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  163|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  164|      1|	VipsStatisticClass *sclass = VIPS_STATISTIC_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  165|       |
  166|      1|	gobject_class->set_property = vips_object_set_property;
  167|      1|	gobject_class->get_property = vips_object_get_property;
  168|       |
  169|      1|	object_class->nickname = "hough";
  170|      1|	object_class->description = _("find hough transform");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  171|      1|	object_class->build = vips_hough_build;
  172|       |
  173|      1|	sclass->start = vips_hough_start;
  174|      1|	sclass->scan = vips_hough_scan;
  175|      1|	sclass->stop = vips_hough_stop;
  176|      1|	sclass->format_table = vips_hough_format_table;
  177|       |
  178|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  179|      1|		_("Output"),
  180|      1|		_("Output image"),
  181|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  182|      1|		G_STRUCT_OFFSET(VipsHough, out));
  183|      1|}

hough_circle.c:vips_hough_circle_class_init:
  217|      1|{
  218|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  219|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  220|      1|	VipsHoughClass *hclass = (VipsHoughClass *) class;
  221|       |
  222|      1|	gobject_class->set_property = vips_object_set_property;
  223|      1|	gobject_class->get_property = vips_object_get_property;
  224|       |
  225|      1|	object_class->nickname = "hough_circle";
  226|      1|	object_class->description = _("find hough circle transform");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  227|      1|	object_class->build = vips_hough_circle_build;
  228|       |
  229|      1|	hclass->init_accumulator = vips_hough_circle_init_accumulator;
  230|      1|	hclass->vote = vips_hough_circle_vote;
  231|       |
  232|      1|	VIPS_ARG_INT(class, "scale", 119,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  233|      1|		_("Scale"),
  234|      1|		_("Scale down dimensions by this factor"),
  235|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  236|      1|		G_STRUCT_OFFSET(VipsHoughCircle, scale),
  237|      1|		1, 100000, 1);
  238|       |
  239|      1|	VIPS_ARG_INT(class, "min_radius", 120,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  240|      1|		_("Min radius"),
  241|      1|		_("Smallest radius to search for"),
  242|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  243|      1|		G_STRUCT_OFFSET(VipsHoughCircle, min_radius),
  244|      1|		1, 100000, 10);
  245|       |
  246|      1|	VIPS_ARG_INT(class, "max_radius", 121,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  247|      1|		_("Max radius"),
  248|      1|		_("Largest radius to search for"),
  249|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  250|      1|		G_STRUCT_OFFSET(VipsHoughCircle, max_radius),
  251|      1|		1, 100000, 20);
  252|      1|}

hough_line.c:vips_hough_line_class_init:
  131|      1|{
  132|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  133|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  134|      1|	VipsHoughClass *hclass = (VipsHoughClass *) class;
  135|       |
  136|      1|	gobject_class->set_property = vips_object_set_property;
  137|      1|	gobject_class->get_property = vips_object_get_property;
  138|       |
  139|      1|	object_class->nickname = "hough_line";
  140|      1|	object_class->description = _("find hough line transform");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  141|      1|	object_class->build = vips_hough_line_build;
  142|       |
  143|      1|	hclass->init_accumulator = vips_hough_line_init_accumulator;
  144|      1|	hclass->vote = vips_hough_line_vote;
  145|       |
  146|      1|	VIPS_ARG_INT(class, "width", 110,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  147|      1|		_("Width"),
  148|      1|		_("Horizontal size of parameter space"),
  149|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  150|      1|		G_STRUCT_OFFSET(VipsHoughLine, width),
  151|      1|		1, 100000, 256);
  152|       |
  153|      1|	VIPS_ARG_INT(class, "height", 111,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  154|      1|		_("Height"),
  155|      1|		_("Vertical size of parameter space"),
  156|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  157|      1|		G_STRUCT_OFFSET(VipsHoughLine, height),
  158|      1|		1, 100000, 256);
  159|      1|}

invert.c:vips_invert_class_init:
  173|      1|{
  174|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  175|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  176|       |
  177|      1|	object_class->nickname = "invert";
  178|      1|	object_class->description = _("invert an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  179|       |
  180|      1|	aclass->process_line = vips_invert_buffer;
  181|       |
  182|      1|	vips_arithmetic_set_format_table(aclass, vips_invert_format_table);
  183|      1|}

vips_linear:
  531|  8.75k|{
  532|  8.75k|	va_list ap;
  533|  8.75k|	int result;
  534|       |
  535|  8.75k|	va_start(ap, n);
  536|  8.75k|	result = vips_linearv(in, out, a, b, n, ap);
  537|  8.75k|	va_end(ap);
  538|       |
  539|  8.75k|	return result;
  540|  8.75k|}
linear.c:vips_linear_class_init:
  437|      1|{
  438|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  439|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  440|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  441|       |
  442|      1|	gobject_class->set_property = vips_object_set_property;
  443|      1|	gobject_class->get_property = vips_object_get_property;
  444|       |
  445|      1|	object_class->nickname = "linear";
  446|      1|	object_class->description = _("calculate (a * in + b)");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  447|      1|	object_class->build = vips_linear_build;
  448|       |
  449|      1|	aclass->process_line = vips_linear_buffer;
  450|       |
  451|      1|	vips_arithmetic_set_format_table(aclass, vips_linear_format_table);
  452|       |
  453|      1|	VIPS_ARG_BOXED(class, "a", 110,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  454|      1|		_("a"),
  455|      1|		_("Multiply by this"),
  456|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  457|      1|		G_STRUCT_OFFSET(VipsLinear, a),
  458|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  459|       |
  460|      1|	VIPS_ARG_BOXED(class, "b", 111,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  461|      1|		_("b"),
  462|      1|		_("Add this"),
  463|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  464|      1|		G_STRUCT_OFFSET(VipsLinear, b),
  465|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  466|       |
  467|      1|	VIPS_ARG_BOOL(class, "uchar", 112,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  468|      1|		_("uchar"),
  469|      1|		_("Output should be uchar"),
  470|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  471|      1|		G_STRUCT_OFFSET(VipsLinear, uchar),
  472|      1|		FALSE);
  473|      1|}
linear.c:vips_linear_build:
  120|  8.75k|{
  121|  8.75k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  8.75k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  8.75k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  8.75k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  122|  8.75k|	VipsArithmetic *arithmetic = VIPS_ARITHMETIC(object);
  ------------------
  |  |   42|  8.75k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  8.75k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  8.75k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  8.75k|		VIPS_TYPE_ARITHMETIC, VipsArithmetic))
  ------------------
  123|  8.75k|	VipsUnary *unary = (VipsUnary *) object;
  124|  8.75k|	VipsLinear *linear = (VipsLinear *) object;
  125|       |
  126|  8.75k|	int i;
  127|       |
  128|       |	/* If we have a three-element vector, we need to bandup the image to
  129|       |	 * match.
  130|       |	 */
  131|  8.75k|	linear->n = 1;
  132|  8.75k|	if (linear->a)
  ------------------
  |  Branch (132:6): [True: 8.75k, False: 0]
  ------------------
  133|  8.75k|		linear->n = VIPS_MAX(linear->n, linear->a->n);
  ------------------
  |  |   54|  8.75k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 8.75k]
  |  |  ------------------
  ------------------
  134|  8.75k|	if (linear->b)
  ------------------
  |  Branch (134:6): [True: 8.75k, False: 0]
  ------------------
  135|  8.75k|		linear->n = VIPS_MAX(linear->n, linear->b->n);
  ------------------
  |  |   54|  8.75k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 8.75k]
  |  |  ------------------
  ------------------
  136|  8.75k|	if (unary->in) {
  ------------------
  |  Branch (136:6): [True: 8.75k, False: 0]
  ------------------
  137|  8.75k|		int bands;
  138|       |
  139|  8.75k|		vips_image_decode_predict(unary->in, &bands, NULL);
  140|  8.75k|		linear->n = VIPS_MAX(linear->n, bands);
  ------------------
  |  |   54|  8.75k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 8.75k]
  |  |  ------------------
  ------------------
  141|  8.75k|	}
  142|  8.75k|	arithmetic->base_bands = linear->n;
  143|       |
  144|  8.75k|	if (unary->in &&
  ------------------
  |  Branch (144:6): [True: 8.75k, False: 0]
  ------------------
  145|  8.75k|		linear->a &&
  ------------------
  |  Branch (145:3): [True: 8.75k, False: 0]
  ------------------
  146|  8.75k|		linear->b) {
  ------------------
  |  Branch (146:3): [True: 8.75k, False: 0]
  ------------------
  147|  8.75k|		if (vips_check_vector(class->nickname,
  ------------------
  |  Branch (147:7): [True: 0, False: 8.75k]
  ------------------
  148|  8.75k|				linear->a->n, unary->in) ||
  149|  8.75k|			vips_check_vector(class->nickname,
  ------------------
  |  Branch (149:4): [True: 0, False: 8.75k]
  ------------------
  150|  8.75k|				linear->b->n, unary->in))
  151|      0|			return -1;
  152|  8.75k|	}
  153|       |
  154|       |	/* If all elements of the constants are equal, we can shrink them down
  155|       |	 * to a single element.
  156|       |	 */
  157|  8.75k|	if (linear->a) {
  ------------------
  |  Branch (157:6): [True: 8.75k, False: 0]
  ------------------
  158|  8.75k|		double *ary = (double *) linear->a->data;
  159|  8.75k|		gboolean all_equal;
  160|       |
  161|  8.75k|		all_equal = TRUE;
  ------------------
  |  |  798|  8.75k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  8.75k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  162|  8.75k|		for (i = 1; i < linear->a->n; i++)
  ------------------
  |  Branch (162:15): [True: 0, False: 8.75k]
  ------------------
  163|      0|			if (ary[i] != ary[0]) {
  ------------------
  |  Branch (163:8): [True: 0, False: 0]
  ------------------
  164|      0|				all_equal = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  165|      0|				break;
  166|      0|			}
  167|       |
  168|  8.75k|		if (all_equal)
  ------------------
  |  Branch (168:7): [True: 8.75k, False: 0]
  ------------------
  169|  8.75k|			linear->a->n = 1;
  170|  8.75k|	}
  171|  8.75k|	if (linear->b) {
  ------------------
  |  Branch (171:6): [True: 8.75k, False: 0]
  ------------------
  172|  8.75k|		double *ary = (double *) linear->b->data;
  173|  8.75k|		gboolean all_equal;
  174|       |
  175|  8.75k|		all_equal = TRUE;
  ------------------
  |  |  798|  8.75k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  8.75k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  176|  8.75k|		for (i = 1; i < linear->b->n; i++)
  ------------------
  |  Branch (176:15): [True: 0, False: 8.75k]
  ------------------
  177|      0|			if (ary[i] != ary[0]) {
  ------------------
  |  Branch (177:8): [True: 0, False: 0]
  ------------------
  178|      0|				all_equal = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  179|      0|				break;
  180|      0|			}
  181|       |
  182|  8.75k|		if (all_equal)
  ------------------
  |  Branch (182:7): [True: 8.75k, False: 0]
  ------------------
  183|  8.75k|			linear->b->n = 1;
  184|  8.75k|	}
  185|       |
  186|       |	/* Make up-banded versions of our constants.
  187|       |	 */
  188|  8.75k|	linear->a_ready = VIPS_ARRAY(linear, linear->n, double);
  ------------------
  |  |   72|  8.75k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  8.75k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  8.75k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  8.75k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  8.75k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|  8.75k|	linear->b_ready = VIPS_ARRAY(linear, linear->n, double);
  ------------------
  |  |   72|  8.75k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  8.75k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  8.75k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  8.75k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  8.75k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  190|       |
  191|  17.5k|	for (i = 0; i < linear->n; i++) {
  ------------------
  |  Branch (191:14): [True: 8.77k, False: 8.75k]
  ------------------
  192|  8.77k|		if (linear->a) {
  ------------------
  |  Branch (192:7): [True: 8.77k, False: 0]
  ------------------
  193|  8.77k|			double *ary = (double *) linear->a->data;
  194|  8.77k|			int j = VIPS_MIN(i, linear->a->n - 1);
  ------------------
  |  |   55|  8.77k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 8.77k]
  |  |  ------------------
  ------------------
  195|       |
  196|  8.77k|			linear->a_ready[i] = ary[j];
  197|  8.77k|		}
  198|       |
  199|  8.77k|		if (linear->b) {
  ------------------
  |  Branch (199:7): [True: 8.77k, False: 0]
  ------------------
  200|  8.77k|			double *ary = (double *) linear->b->data;
  201|  8.77k|			int j = VIPS_MIN(i, linear->b->n - 1);
  ------------------
  |  |   55|  8.77k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 8.77k]
  |  |  ------------------
  ------------------
  202|       |
  203|  8.77k|			linear->b_ready[i] = ary[j];
  204|  8.77k|		}
  205|  8.77k|	}
  206|       |
  207|  8.75k|	if (linear->uchar)
  ------------------
  |  Branch (207:6): [True: 0, False: 8.75k]
  ------------------
  208|      0|		arithmetic->format = VIPS_FORMAT_UCHAR;
  209|       |
  210|  8.75k|	if (VIPS_OBJECT_CLASS(vips_linear_parent_class)->build(object))
  ------------------
  |  |  435|  8.75k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  8.75k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  8.75k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (210:6): [True: 0, False: 8.75k]
  ------------------
  211|      0|		return -1;
  212|       |
  213|  8.75k|	return 0;
  214|  8.75k|}
linear.c:vips_linear_buffer:
  332|  8.75k|{
  333|  8.75k|	VipsImage *im = arithmetic->ready[0];
  334|  8.75k|	VipsLinear *linear = (VipsLinear *) arithmetic;
  335|  8.75k|	double *restrict a = linear->a_ready;
  336|  8.75k|	double *restrict b = linear->b_ready;
  337|  8.75k|	int nb = im->Bands;
  338|       |
  339|  8.75k|	int i, x, k;
  340|       |
  341|  8.75k|	if (linear->uchar)
  ------------------
  |  Branch (341:6): [True: 0, False: 8.75k]
  ------------------
  342|      0|		switch (vips_image_get_format(im)) {
  343|      0|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (343:3): [True: 0, False: 0]
  ------------------
  344|      0|			LOOPuc(unsigned char);
  ------------------
  |  |  302|      0|	{ \
  |  |  303|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (303:7): [True: 0, False: 0]
  |  |  |  Branch (303:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  304|      0|			LOOP1uc(IN); \
  |  |  ------------------
  |  |  |  |  272|      0|	{ \
  |  |  |  |  273|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  274|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  275|      0|		float a1 = a[0]; \
  |  |  |  |  276|      0|		float b1 = b[0]; \
  |  |  |  |  277|      0|		int sz = width * nb; \
  |  |  |  |  278|      0|\
  |  |  |  |  279|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (279:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  280|      0|			float t = a1 * p[x] + b1; \
  |  |  |  |  281|      0|\
  |  |  |  |  282|      0|			q[x] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  283|      0|		} \
  |  |  |  |  284|      0|	}
  |  |  ------------------
  |  |  305|      0|		} \
  |  |  306|      0|		else { \
  |  |  307|      0|			LOOPNuc(IN); \
  |  |  ------------------
  |  |  |  |  289|      0|	{ \
  |  |  |  |  290|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  291|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  292|      0|\
  |  |  |  |  293|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (293:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  294|      0|			for (k = 0; k < nb; k++, i++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (294:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  295|      0|				double t = a[k] * p[i] + b[k]; \
  |  |  |  |  296|      0|\
  |  |  |  |  297|      0|				q[i] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  298|      0|			} \
  |  |  |  |  299|      0|	}
  |  |  ------------------
  |  |  308|      0|		} \
  |  |  309|      0|	}
  ------------------
  345|      0|			break;
  346|      0|		case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (346:3): [True: 0, False: 0]
  ------------------
  347|      0|			LOOPuc(signed char);
  ------------------
  |  |  302|      0|	{ \
  |  |  303|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (303:7): [True: 0, False: 0]
  |  |  |  Branch (303:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  304|      0|			LOOP1uc(IN); \
  |  |  ------------------
  |  |  |  |  272|      0|	{ \
  |  |  |  |  273|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  274|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  275|      0|		float a1 = a[0]; \
  |  |  |  |  276|      0|		float b1 = b[0]; \
  |  |  |  |  277|      0|		int sz = width * nb; \
  |  |  |  |  278|      0|\
  |  |  |  |  279|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (279:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  280|      0|			float t = a1 * p[x] + b1; \
  |  |  |  |  281|      0|\
  |  |  |  |  282|      0|			q[x] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  283|      0|		} \
  |  |  |  |  284|      0|	}
  |  |  ------------------
  |  |  305|      0|		} \
  |  |  306|      0|		else { \
  |  |  307|      0|			LOOPNuc(IN); \
  |  |  ------------------
  |  |  |  |  289|      0|	{ \
  |  |  |  |  290|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  291|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  292|      0|\
  |  |  |  |  293|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (293:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  294|      0|			for (k = 0; k < nb; k++, i++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (294:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  295|      0|				double t = a[k] * p[i] + b[k]; \
  |  |  |  |  296|      0|\
  |  |  |  |  297|      0|				q[i] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  298|      0|			} \
  |  |  |  |  299|      0|	}
  |  |  ------------------
  |  |  308|      0|		} \
  |  |  309|      0|	}
  ------------------
  348|      0|			break;
  349|      0|		case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (349:3): [True: 0, False: 0]
  ------------------
  350|      0|			LOOPuc(unsigned short);
  ------------------
  |  |  302|      0|	{ \
  |  |  303|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (303:7): [True: 0, False: 0]
  |  |  |  Branch (303:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  304|      0|			LOOP1uc(IN); \
  |  |  ------------------
  |  |  |  |  272|      0|	{ \
  |  |  |  |  273|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  274|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  275|      0|		float a1 = a[0]; \
  |  |  |  |  276|      0|		float b1 = b[0]; \
  |  |  |  |  277|      0|		int sz = width * nb; \
  |  |  |  |  278|      0|\
  |  |  |  |  279|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (279:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  280|      0|			float t = a1 * p[x] + b1; \
  |  |  |  |  281|      0|\
  |  |  |  |  282|      0|			q[x] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  283|      0|		} \
  |  |  |  |  284|      0|	}
  |  |  ------------------
  |  |  305|      0|		} \
  |  |  306|      0|		else { \
  |  |  307|      0|			LOOPNuc(IN); \
  |  |  ------------------
  |  |  |  |  289|      0|	{ \
  |  |  |  |  290|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  291|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  292|      0|\
  |  |  |  |  293|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (293:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  294|      0|			for (k = 0; k < nb; k++, i++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (294:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  295|      0|				double t = a[k] * p[i] + b[k]; \
  |  |  |  |  296|      0|\
  |  |  |  |  297|      0|				q[i] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  298|      0|			} \
  |  |  |  |  299|      0|	}
  |  |  ------------------
  |  |  308|      0|		} \
  |  |  309|      0|	}
  ------------------
  351|      0|			break;
  352|      0|		case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (352:3): [True: 0, False: 0]
  ------------------
  353|      0|			LOOPuc(signed short);
  ------------------
  |  |  302|      0|	{ \
  |  |  303|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (303:7): [True: 0, False: 0]
  |  |  |  Branch (303:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  304|      0|			LOOP1uc(IN); \
  |  |  ------------------
  |  |  |  |  272|      0|	{ \
  |  |  |  |  273|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  274|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  275|      0|		float a1 = a[0]; \
  |  |  |  |  276|      0|		float b1 = b[0]; \
  |  |  |  |  277|      0|		int sz = width * nb; \
  |  |  |  |  278|      0|\
  |  |  |  |  279|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (279:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  280|      0|			float t = a1 * p[x] + b1; \
  |  |  |  |  281|      0|\
  |  |  |  |  282|      0|			q[x] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  283|      0|		} \
  |  |  |  |  284|      0|	}
  |  |  ------------------
  |  |  305|      0|		} \
  |  |  306|      0|		else { \
  |  |  307|      0|			LOOPNuc(IN); \
  |  |  ------------------
  |  |  |  |  289|      0|	{ \
  |  |  |  |  290|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  291|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  292|      0|\
  |  |  |  |  293|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (293:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  294|      0|			for (k = 0; k < nb; k++, i++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (294:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  295|      0|				double t = a[k] * p[i] + b[k]; \
  |  |  |  |  296|      0|\
  |  |  |  |  297|      0|				q[i] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  298|      0|			} \
  |  |  |  |  299|      0|	}
  |  |  ------------------
  |  |  308|      0|		} \
  |  |  309|      0|	}
  ------------------
  354|      0|			break;
  355|      0|		case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (355:3): [True: 0, False: 0]
  ------------------
  356|      0|			LOOPuc(unsigned int);
  ------------------
  |  |  302|      0|	{ \
  |  |  303|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (303:7): [True: 0, False: 0]
  |  |  |  Branch (303:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  304|      0|			LOOP1uc(IN); \
  |  |  ------------------
  |  |  |  |  272|      0|	{ \
  |  |  |  |  273|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  274|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  275|      0|		float a1 = a[0]; \
  |  |  |  |  276|      0|		float b1 = b[0]; \
  |  |  |  |  277|      0|		int sz = width * nb; \
  |  |  |  |  278|      0|\
  |  |  |  |  279|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (279:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  280|      0|			float t = a1 * p[x] + b1; \
  |  |  |  |  281|      0|\
  |  |  |  |  282|      0|			q[x] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  283|      0|		} \
  |  |  |  |  284|      0|	}
  |  |  ------------------
  |  |  305|      0|		} \
  |  |  306|      0|		else { \
  |  |  307|      0|			LOOPNuc(IN); \
  |  |  ------------------
  |  |  |  |  289|      0|	{ \
  |  |  |  |  290|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  291|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  292|      0|\
  |  |  |  |  293|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (293:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  294|      0|			for (k = 0; k < nb; k++, i++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (294:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  295|      0|				double t = a[k] * p[i] + b[k]; \
  |  |  |  |  296|      0|\
  |  |  |  |  297|      0|				q[i] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  298|      0|			} \
  |  |  |  |  299|      0|	}
  |  |  ------------------
  |  |  308|      0|		} \
  |  |  309|      0|	}
  ------------------
  357|      0|			break;
  358|      0|		case VIPS_FORMAT_INT:
  ------------------
  |  Branch (358:3): [True: 0, False: 0]
  ------------------
  359|      0|			LOOPuc(signed int);
  ------------------
  |  |  302|      0|	{ \
  |  |  303|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (303:7): [True: 0, False: 0]
  |  |  |  Branch (303:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  304|      0|			LOOP1uc(IN); \
  |  |  ------------------
  |  |  |  |  272|      0|	{ \
  |  |  |  |  273|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  274|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  275|      0|		float a1 = a[0]; \
  |  |  |  |  276|      0|		float b1 = b[0]; \
  |  |  |  |  277|      0|		int sz = width * nb; \
  |  |  |  |  278|      0|\
  |  |  |  |  279|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (279:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  280|      0|			float t = a1 * p[x] + b1; \
  |  |  |  |  281|      0|\
  |  |  |  |  282|      0|			q[x] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  283|      0|		} \
  |  |  |  |  284|      0|	}
  |  |  ------------------
  |  |  305|      0|		} \
  |  |  306|      0|		else { \
  |  |  307|      0|			LOOPNuc(IN); \
  |  |  ------------------
  |  |  |  |  289|      0|	{ \
  |  |  |  |  290|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  291|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  292|      0|\
  |  |  |  |  293|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (293:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  294|      0|			for (k = 0; k < nb; k++, i++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (294:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  295|      0|				double t = a[k] * p[i] + b[k]; \
  |  |  |  |  296|      0|\
  |  |  |  |  297|      0|				q[i] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  298|      0|			} \
  |  |  |  |  299|      0|	}
  |  |  ------------------
  |  |  308|      0|		} \
  |  |  309|      0|	}
  ------------------
  360|      0|			break;
  361|      0|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (361:3): [True: 0, False: 0]
  ------------------
  362|      0|			LOOPuc(float);
  ------------------
  |  |  302|      0|	{ \
  |  |  303|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (303:7): [True: 0, False: 0]
  |  |  |  Branch (303:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  304|      0|			LOOP1uc(IN); \
  |  |  ------------------
  |  |  |  |  272|      0|	{ \
  |  |  |  |  273|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  274|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  275|      0|		float a1 = a[0]; \
  |  |  |  |  276|      0|		float b1 = b[0]; \
  |  |  |  |  277|      0|		int sz = width * nb; \
  |  |  |  |  278|      0|\
  |  |  |  |  279|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (279:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  280|      0|			float t = a1 * p[x] + b1; \
  |  |  |  |  281|      0|\
  |  |  |  |  282|      0|			q[x] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  283|      0|		} \
  |  |  |  |  284|      0|	}
  |  |  ------------------
  |  |  305|      0|		} \
  |  |  306|      0|		else { \
  |  |  307|      0|			LOOPNuc(IN); \
  |  |  ------------------
  |  |  |  |  289|      0|	{ \
  |  |  |  |  290|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  291|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  292|      0|\
  |  |  |  |  293|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (293:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  294|      0|			for (k = 0; k < nb; k++, i++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (294:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  295|      0|				double t = a[k] * p[i] + b[k]; \
  |  |  |  |  296|      0|\
  |  |  |  |  297|      0|				q[i] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  298|      0|			} \
  |  |  |  |  299|      0|	}
  |  |  ------------------
  |  |  308|      0|		} \
  |  |  309|      0|	}
  ------------------
  363|      0|			break;
  364|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (364:3): [True: 0, False: 0]
  ------------------
  365|      0|			LOOPuc(double);
  ------------------
  |  |  302|      0|	{ \
  |  |  303|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (303:7): [True: 0, False: 0]
  |  |  |  Branch (303:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  304|      0|			LOOP1uc(IN); \
  |  |  ------------------
  |  |  |  |  272|      0|	{ \
  |  |  |  |  273|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  274|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  275|      0|		float a1 = a[0]; \
  |  |  |  |  276|      0|		float b1 = b[0]; \
  |  |  |  |  277|      0|		int sz = width * nb; \
  |  |  |  |  278|      0|\
  |  |  |  |  279|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (279:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  280|      0|			float t = a1 * p[x] + b1; \
  |  |  |  |  281|      0|\
  |  |  |  |  282|      0|			q[x] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  283|      0|		} \
  |  |  |  |  284|      0|	}
  |  |  ------------------
  |  |  305|      0|		} \
  |  |  306|      0|		else { \
  |  |  307|      0|			LOOPNuc(IN); \
  |  |  ------------------
  |  |  |  |  289|      0|	{ \
  |  |  |  |  290|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  291|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  |  |  292|      0|\
  |  |  |  |  293|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (293:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  294|      0|			for (k = 0; k < nb; k++, i++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (294:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  295|      0|				double t = a[k] * p[i] + b[k]; \
  |  |  |  |  296|      0|\
  |  |  |  |  297|      0|				q[i] = VIPS_FCLIP(0, t, 255); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  298|      0|			} \
  |  |  |  |  299|      0|	}
  |  |  ------------------
  |  |  308|      0|		} \
  |  |  309|      0|	}
  ------------------
  366|      0|			break;
  367|      0|		case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (367:3): [True: 0, False: 0]
  ------------------
  368|      0|			LOOPCMPLXNuc(float);
  ------------------
  |  |  314|      0|	{ \
  |  |  315|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  316|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  317|      0|\
  |  |  318|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  ------------------
  |  |  |  Branch (318:22): [True: 0, False: 0]
  |  |  ------------------
  |  |  319|      0|			for (k = 0; k < nb; k++, i++) { \
  |  |  ------------------
  |  |  |  Branch (319:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  320|      0|				double t = a[k] * p[0] + b[k]; \
  |  |  321|      0|\
  |  |  322|      0|				q[i] = VIPS_FCLIP(0, t, 255); \
  |  |  ------------------
  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  ------------------
  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|      0|				p += 2; \
  |  |  324|      0|			} \
  |  |  325|      0|	}
  ------------------
  369|      0|			break;
  370|      0|		case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (370:3): [True: 0, False: 0]
  ------------------
  371|      0|			LOOPCMPLXNuc(double);
  ------------------
  |  |  314|      0|	{ \
  |  |  315|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  316|      0|		VipsPel *restrict q = (VipsPel *) out; \
  |  |  317|      0|\
  |  |  318|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  ------------------
  |  |  |  Branch (318:22): [True: 0, False: 0]
  |  |  ------------------
  |  |  319|      0|			for (k = 0; k < nb; k++, i++) { \
  |  |  ------------------
  |  |  |  Branch (319:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  320|      0|				double t = a[k] * p[0] + b[k]; \
  |  |  321|      0|\
  |  |  322|      0|				q[i] = VIPS_FCLIP(0, t, 255); \
  |  |  ------------------
  |  |  |  |   58|      0|#define VIPS_FCLIP(A, V, B) VIPS_FMAX((A), VIPS_FMIN((B), (V)))
  |  |  |  |  ------------------
  |  |  |  |  |  |   77|      0|#define VIPS_FMAX(A, B) __builtin_fmax(A, B)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|      0|				p += 2; \
  |  |  324|      0|			} \
  |  |  325|      0|	}
  ------------------
  372|      0|			break;
  373|       |
  374|      0|		default:
  ------------------
  |  Branch (374:3): [True: 0, False: 0]
  ------------------
  375|      0|			g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  376|      0|		}
  377|  8.75k|	else
  378|  8.75k|		switch (vips_image_get_format(im)) {
  379|  8.75k|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (379:3): [True: 8.75k, False: 0]
  ------------------
  380|  8.75k|			LOOP(unsigned char, float);
  ------------------
  |  |  243|  8.75k|	{ \
  |  |  244|  8.75k|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (244:7): [True: 8.75k, False: 0]
  |  |  |  Branch (244:28): [True: 8.75k, False: 0]
  |  |  ------------------
  |  |  245|  8.75k|			LOOP1(IN, OUT); \
  |  |  ------------------
  |  |  |  |  219|  8.75k|	{ \
  |  |  |  |  220|  8.75k|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  221|  8.75k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  222|  8.75k|		OUT a1 = a[0]; \
  |  |  |  |  223|  8.75k|		OUT b1 = b[0]; \
  |  |  |  |  224|  8.75k|		int sz = width * nb; \
  |  |  |  |  225|  8.75k|\
  |  |  |  |  226|  17.5k|		for (x = 0; x < sz; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (226:15): [True: 8.77k, False: 8.75k]
  |  |  |  |  ------------------
  |  |  |  |  227|  8.77k|			q[x] = a1 * (OUT) p[x] + b1; \
  |  |  |  |  228|  8.75k|	}
  |  |  ------------------
  |  |  246|  8.75k|		} \
  |  |  247|  8.75k|		else { \
  |  |  248|      0|			LOOPN(IN, OUT); \
  |  |  ------------------
  |  |  |  |  233|      0|	{ \
  |  |  |  |  234|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  235|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  236|      0|\
  |  |  |  |  237|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (237:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  238|      0|			for (k = 0; k < nb; k++, i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (238:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  239|      0|				q[i] = a[k] * (OUT) p[i] + b[k]; \
  |  |  |  |  240|      0|	}
  |  |  ------------------
  |  |  249|      0|		} \
  |  |  250|  8.75k|	}
  ------------------
  381|  8.75k|			break;
  382|      0|		case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (382:3): [True: 0, False: 8.75k]
  ------------------
  383|      0|			LOOP(signed char, float);
  ------------------
  |  |  243|      0|	{ \
  |  |  244|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (244:7): [True: 0, False: 0]
  |  |  |  Branch (244:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  245|      0|			LOOP1(IN, OUT); \
  |  |  ------------------
  |  |  |  |  219|      0|	{ \
  |  |  |  |  220|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  221|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  222|      0|		OUT a1 = a[0]; \
  |  |  |  |  223|      0|		OUT b1 = b[0]; \
  |  |  |  |  224|      0|		int sz = width * nb; \
  |  |  |  |  225|      0|\
  |  |  |  |  226|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (226:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  227|      0|			q[x] = a1 * (OUT) p[x] + b1; \
  |  |  |  |  228|      0|	}
  |  |  ------------------
  |  |  246|      0|		} \
  |  |  247|      0|		else { \
  |  |  248|      0|			LOOPN(IN, OUT); \
  |  |  ------------------
  |  |  |  |  233|      0|	{ \
  |  |  |  |  234|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  235|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  236|      0|\
  |  |  |  |  237|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (237:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  238|      0|			for (k = 0; k < nb; k++, i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (238:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  239|      0|				q[i] = a[k] * (OUT) p[i] + b[k]; \
  |  |  |  |  240|      0|	}
  |  |  ------------------
  |  |  249|      0|		} \
  |  |  250|      0|	}
  ------------------
  384|      0|			break;
  385|      0|		case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (385:3): [True: 0, False: 8.75k]
  ------------------
  386|      0|			LOOP(unsigned short, float);
  ------------------
  |  |  243|      0|	{ \
  |  |  244|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (244:7): [True: 0, False: 0]
  |  |  |  Branch (244:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  245|      0|			LOOP1(IN, OUT); \
  |  |  ------------------
  |  |  |  |  219|      0|	{ \
  |  |  |  |  220|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  221|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  222|      0|		OUT a1 = a[0]; \
  |  |  |  |  223|      0|		OUT b1 = b[0]; \
  |  |  |  |  224|      0|		int sz = width * nb; \
  |  |  |  |  225|      0|\
  |  |  |  |  226|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (226:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  227|      0|			q[x] = a1 * (OUT) p[x] + b1; \
  |  |  |  |  228|      0|	}
  |  |  ------------------
  |  |  246|      0|		} \
  |  |  247|      0|		else { \
  |  |  248|      0|			LOOPN(IN, OUT); \
  |  |  ------------------
  |  |  |  |  233|      0|	{ \
  |  |  |  |  234|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  235|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  236|      0|\
  |  |  |  |  237|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (237:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  238|      0|			for (k = 0; k < nb; k++, i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (238:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  239|      0|				q[i] = a[k] * (OUT) p[i] + b[k]; \
  |  |  |  |  240|      0|	}
  |  |  ------------------
  |  |  249|      0|		} \
  |  |  250|      0|	}
  ------------------
  387|      0|			break;
  388|      0|		case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (388:3): [True: 0, False: 8.75k]
  ------------------
  389|      0|			LOOP(signed short, float);
  ------------------
  |  |  243|      0|	{ \
  |  |  244|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (244:7): [True: 0, False: 0]
  |  |  |  Branch (244:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  245|      0|			LOOP1(IN, OUT); \
  |  |  ------------------
  |  |  |  |  219|      0|	{ \
  |  |  |  |  220|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  221|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  222|      0|		OUT a1 = a[0]; \
  |  |  |  |  223|      0|		OUT b1 = b[0]; \
  |  |  |  |  224|      0|		int sz = width * nb; \
  |  |  |  |  225|      0|\
  |  |  |  |  226|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (226:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  227|      0|			q[x] = a1 * (OUT) p[x] + b1; \
  |  |  |  |  228|      0|	}
  |  |  ------------------
  |  |  246|      0|		} \
  |  |  247|      0|		else { \
  |  |  248|      0|			LOOPN(IN, OUT); \
  |  |  ------------------
  |  |  |  |  233|      0|	{ \
  |  |  |  |  234|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  235|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  236|      0|\
  |  |  |  |  237|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (237:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  238|      0|			for (k = 0; k < nb; k++, i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (238:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  239|      0|				q[i] = a[k] * (OUT) p[i] + b[k]; \
  |  |  |  |  240|      0|	}
  |  |  ------------------
  |  |  249|      0|		} \
  |  |  250|      0|	}
  ------------------
  390|      0|			break;
  391|      0|		case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (391:3): [True: 0, False: 8.75k]
  ------------------
  392|      0|			LOOP(unsigned int, float);
  ------------------
  |  |  243|      0|	{ \
  |  |  244|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (244:7): [True: 0, False: 0]
  |  |  |  Branch (244:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  245|      0|			LOOP1(IN, OUT); \
  |  |  ------------------
  |  |  |  |  219|      0|	{ \
  |  |  |  |  220|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  221|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  222|      0|		OUT a1 = a[0]; \
  |  |  |  |  223|      0|		OUT b1 = b[0]; \
  |  |  |  |  224|      0|		int sz = width * nb; \
  |  |  |  |  225|      0|\
  |  |  |  |  226|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (226:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  227|      0|			q[x] = a1 * (OUT) p[x] + b1; \
  |  |  |  |  228|      0|	}
  |  |  ------------------
  |  |  246|      0|		} \
  |  |  247|      0|		else { \
  |  |  248|      0|			LOOPN(IN, OUT); \
  |  |  ------------------
  |  |  |  |  233|      0|	{ \
  |  |  |  |  234|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  235|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  236|      0|\
  |  |  |  |  237|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (237:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  238|      0|			for (k = 0; k < nb; k++, i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (238:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  239|      0|				q[i] = a[k] * (OUT) p[i] + b[k]; \
  |  |  |  |  240|      0|	}
  |  |  ------------------
  |  |  249|      0|		} \
  |  |  250|      0|	}
  ------------------
  393|      0|			break;
  394|      0|		case VIPS_FORMAT_INT:
  ------------------
  |  Branch (394:3): [True: 0, False: 8.75k]
  ------------------
  395|      0|			LOOP(signed int, float);
  ------------------
  |  |  243|      0|	{ \
  |  |  244|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (244:7): [True: 0, False: 0]
  |  |  |  Branch (244:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  245|      0|			LOOP1(IN, OUT); \
  |  |  ------------------
  |  |  |  |  219|      0|	{ \
  |  |  |  |  220|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  221|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  222|      0|		OUT a1 = a[0]; \
  |  |  |  |  223|      0|		OUT b1 = b[0]; \
  |  |  |  |  224|      0|		int sz = width * nb; \
  |  |  |  |  225|      0|\
  |  |  |  |  226|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (226:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  227|      0|			q[x] = a1 * (OUT) p[x] + b1; \
  |  |  |  |  228|      0|	}
  |  |  ------------------
  |  |  246|      0|		} \
  |  |  247|      0|		else { \
  |  |  248|      0|			LOOPN(IN, OUT); \
  |  |  ------------------
  |  |  |  |  233|      0|	{ \
  |  |  |  |  234|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  235|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  236|      0|\
  |  |  |  |  237|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (237:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  238|      0|			for (k = 0; k < nb; k++, i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (238:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  239|      0|				q[i] = a[k] * (OUT) p[i] + b[k]; \
  |  |  |  |  240|      0|	}
  |  |  ------------------
  |  |  249|      0|		} \
  |  |  250|      0|	}
  ------------------
  396|      0|			break;
  397|      0|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (397:3): [True: 0, False: 8.75k]
  ------------------
  398|      0|			LOOP(float, float);
  ------------------
  |  |  243|      0|	{ \
  |  |  244|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (244:7): [True: 0, False: 0]
  |  |  |  Branch (244:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  245|      0|			LOOP1(IN, OUT); \
  |  |  ------------------
  |  |  |  |  219|      0|	{ \
  |  |  |  |  220|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  221|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  222|      0|		OUT a1 = a[0]; \
  |  |  |  |  223|      0|		OUT b1 = b[0]; \
  |  |  |  |  224|      0|		int sz = width * nb; \
  |  |  |  |  225|      0|\
  |  |  |  |  226|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (226:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  227|      0|			q[x] = a1 * (OUT) p[x] + b1; \
  |  |  |  |  228|      0|	}
  |  |  ------------------
  |  |  246|      0|		} \
  |  |  247|      0|		else { \
  |  |  248|      0|			LOOPN(IN, OUT); \
  |  |  ------------------
  |  |  |  |  233|      0|	{ \
  |  |  |  |  234|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  235|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  236|      0|\
  |  |  |  |  237|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (237:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  238|      0|			for (k = 0; k < nb; k++, i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (238:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  239|      0|				q[i] = a[k] * (OUT) p[i] + b[k]; \
  |  |  |  |  240|      0|	}
  |  |  ------------------
  |  |  249|      0|		} \
  |  |  250|      0|	}
  ------------------
  399|      0|			break;
  400|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (400:3): [True: 0, False: 8.75k]
  ------------------
  401|      0|			LOOP(double, double);
  ------------------
  |  |  243|      0|	{ \
  |  |  244|      0|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (244:7): [True: 0, False: 0]
  |  |  |  Branch (244:28): [True: 0, False: 0]
  |  |  ------------------
  |  |  245|      0|			LOOP1(IN, OUT); \
  |  |  ------------------
  |  |  |  |  219|      0|	{ \
  |  |  |  |  220|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  221|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  222|      0|		OUT a1 = a[0]; \
  |  |  |  |  223|      0|		OUT b1 = b[0]; \
  |  |  |  |  224|      0|		int sz = width * nb; \
  |  |  |  |  225|      0|\
  |  |  |  |  226|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (226:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  227|      0|			q[x] = a1 * (OUT) p[x] + b1; \
  |  |  |  |  228|      0|	}
  |  |  ------------------
  |  |  246|      0|		} \
  |  |  247|      0|		else { \
  |  |  248|      0|			LOOPN(IN, OUT); \
  |  |  ------------------
  |  |  |  |  233|      0|	{ \
  |  |  |  |  234|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  235|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  236|      0|\
  |  |  |  |  237|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (237:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  238|      0|			for (k = 0; k < nb; k++, i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (238:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  239|      0|				q[i] = a[k] * (OUT) p[i] + b[k]; \
  |  |  |  |  240|      0|	}
  |  |  ------------------
  |  |  249|      0|		} \
  |  |  250|      0|	}
  ------------------
  402|      0|			break;
  403|      0|		case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (403:3): [True: 0, False: 8.75k]
  ------------------
  404|      0|			LOOPCMPLXN(float, float);
  ------------------
  |  |  255|      0|	{ \
  |  |  256|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  257|      0|		OUT *restrict q = (OUT *) out; \
  |  |  258|      0|\
  |  |  259|      0|		for (x = 0; x < width; x++) \
  |  |  ------------------
  |  |  |  Branch (259:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  260|      0|			for (k = 0; k < nb; k++) { \
  |  |  ------------------
  |  |  |  Branch (260:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  261|      0|				q[0] = a[k] * p[0] + b[k]; \
  |  |  262|      0|				q[1] = p[1]; \
  |  |  263|      0|				q += 2; \
  |  |  264|      0|				p += 2; \
  |  |  265|      0|			} \
  |  |  266|      0|	}
  ------------------
  405|      0|			break;
  406|      0|		case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (406:3): [True: 0, False: 8.75k]
  ------------------
  407|      0|			LOOPCMPLXN(double, double);
  ------------------
  |  |  255|      0|	{ \
  |  |  256|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  257|      0|		OUT *restrict q = (OUT *) out; \
  |  |  258|      0|\
  |  |  259|      0|		for (x = 0; x < width; x++) \
  |  |  ------------------
  |  |  |  Branch (259:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  260|      0|			for (k = 0; k < nb; k++) { \
  |  |  ------------------
  |  |  |  Branch (260:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  261|      0|				q[0] = a[k] * p[0] + b[k]; \
  |  |  262|      0|				q[1] = p[1]; \
  |  |  263|      0|				q += 2; \
  |  |  264|      0|				p += 2; \
  |  |  265|      0|			} \
  |  |  266|      0|	}
  ------------------
  408|      0|			break;
  409|       |
  410|      0|		default:
  ------------------
  |  Branch (410:3): [True: 0, False: 8.75k]
  ------------------
  411|      0|			g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  412|  8.75k|		}
  413|  8.75k|}
linear.c:vips_linear_init:
  477|  8.75k|{
  478|  8.75k|}
linear.c:vips_linearv:
  483|  8.75k|{
  484|  8.75k|	VipsArea *area_a;
  485|  8.75k|	VipsArea *area_b;
  486|  8.75k|	int result;
  487|       |
  488|  8.75k|	area_a = VIPS_AREA(vips_array_double_new(a, n));
  ------------------
  |  |  137|  8.75k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  489|  8.75k|	area_b = VIPS_AREA(vips_array_double_new(b, n));
  ------------------
  |  |  137|  8.75k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  490|       |
  491|  8.75k|	result = vips_call_split("linear", ap, in, out, area_a, area_b);
  492|       |
  493|  8.75k|	vips_area_unref(area_a);
  494|  8.75k|	vips_area_unref(area_b);
  495|       |
  496|  8.75k|	return result;
  497|  8.75k|}

math.c:vips_math_class_init:
  244|      1|{
  245|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  246|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  247|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  248|       |
  249|      1|	gobject_class->set_property = vips_object_set_property;
  250|      1|	gobject_class->get_property = vips_object_get_property;
  251|       |
  252|      1|	object_class->nickname = "math";
  253|      1|	object_class->description = _("apply a math operation to an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  254|      1|	object_class->build = vips_math_build;
  255|       |
  256|      1|	aclass->process_line = vips_math_buffer;
  257|       |
  258|      1|	vips_arithmetic_set_format_table(aclass, vips_math_format_table);
  259|       |
  260|      1|	VIPS_ARG_ENUM(class, "math", 200,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  261|      1|		_("Operation"),
  262|      1|		_("Math to perform"),
  263|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  264|      1|		G_STRUCT_OFFSET(VipsMath, math),
  265|      1|		VIPS_TYPE_OPERATION_MATH, VIPS_OPERATION_MATH_SIN);
  266|      1|}

math2.c:vips_math2_class_init:
  224|      1|{
  225|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  226|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  227|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  228|       |
  229|      1|	gobject_class->set_property = vips_object_set_property;
  230|      1|	gobject_class->get_property = vips_object_get_property;
  231|       |
  232|      1|	object_class->nickname = "math2";
  233|      1|	object_class->description = _("binary math operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  234|      1|	object_class->build = vips_math2_build;
  235|       |
  236|      1|	aclass->process_line = vips_math2_buffer;
  237|       |
  238|      1|	vips_arithmetic_set_format_table(aclass, vips_math2_format_table);
  239|       |
  240|      1|	VIPS_ARG_ENUM(class, "math2", 200,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  241|      1|		_("Operation"),
  242|      1|		_("Math to perform"),
  243|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  244|      1|		G_STRUCT_OFFSET(VipsMath2, math2),
  245|      1|		VIPS_TYPE_OPERATION_MATH2, VIPS_OPERATION_MATH2_POW);
  246|      1|}
math2.c:vips_math2_const_class_init:
  453|      1|{
  454|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  455|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  456|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  457|       |
  458|      1|	gobject_class->set_property = vips_object_set_property;
  459|      1|	gobject_class->get_property = vips_object_get_property;
  460|       |
  461|      1|	object_class->nickname = "math2_const";
  462|      1|	object_class->description =
  463|      1|		_("binary math operations with a constant");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  464|      1|	object_class->build = vips_math2_const_build;
  465|       |
  466|      1|	aclass->process_line = vips_math2_const_buffer;
  467|       |
  468|      1|	vips_arithmetic_set_format_table(aclass, vips_math2_format_table);
  469|       |
  470|      1|	VIPS_ARG_ENUM(class, "math2", 200,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  471|      1|		_("Operation"),
  472|      1|		_("Math to perform"),
  473|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  474|      1|		G_STRUCT_OFFSET(VipsMath2Const, math2),
  475|      1|		VIPS_TYPE_OPERATION_MATH2, VIPS_OPERATION_MATH2_POW);
  476|      1|}

max.c:vips_max_class_init:
  435|      1|{
  436|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  437|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  438|      1|	VipsStatisticClass *sclass = VIPS_STATISTIC_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  439|       |
  440|      1|	gobject_class->set_property = vips_object_set_property;
  441|      1|	gobject_class->get_property = vips_object_get_property;
  442|       |
  443|      1|	object_class->nickname = "max";
  444|      1|	object_class->description = _("find image maximum");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  445|      1|	object_class->build = vips_max_build;
  446|       |
  447|      1|	sclass->start = vips_max_start;
  448|      1|	sclass->scan = vips_max_scan;
  449|      1|	sclass->stop = vips_max_stop;
  450|       |
  451|      1|	VIPS_ARG_DOUBLE(class, "out", 1,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  452|      1|		_("Output"),
  453|      1|		_("Output value"),
  454|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  455|      1|		G_STRUCT_OFFSET(VipsMax, out),
  456|      1|		-INFINITY, INFINITY, 0.0);
  457|       |
  458|      1|	VIPS_ARG_INT(class, "x", 2,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  459|      1|		_("x"),
  460|      1|		_("Horizontal position of maximum"),
  461|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  462|      1|		G_STRUCT_OFFSET(VipsMax, x),
  463|      1|		0, VIPS_MAX_COORD, 0);
  464|       |
  465|      1|	VIPS_ARG_INT(class, "y", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  466|      1|		_("y"),
  467|      1|		_("Vertical position of maximum"),
  468|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  469|      1|		G_STRUCT_OFFSET(VipsMax, y),
  470|      1|		0, VIPS_MAX_COORD, 0);
  471|       |
  472|      1|	VIPS_ARG_INT(class, "size", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  473|      1|		_("Size"),
  474|      1|		_("Number of maximum values to find"),
  475|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  476|      1|		G_STRUCT_OFFSET(VipsMax, size),
  477|      1|		1, 1000000, 1);
  478|       |
  479|      1|	VIPS_ARG_BOXED(class, "out_array", 6,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  480|      1|		_("Output array"),
  481|      1|		_("Array of output values"),
  482|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  483|      1|		G_STRUCT_OFFSET(VipsMax, out_array),
  484|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  485|       |
  486|      1|	VIPS_ARG_BOXED(class, "x_array", 7,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  487|      1|		_("x array"),
  488|      1|		_("Array of horizontal positions"),
  489|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  490|      1|		G_STRUCT_OFFSET(VipsMax, x_array),
  491|      1|		VIPS_TYPE_ARRAY_INT);
  492|       |
  493|      1|	VIPS_ARG_BOXED(class, "y_array", 8,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  494|      1|		_("y array"),
  495|      1|		_("Array of vertical positions"),
  496|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  497|      1|		G_STRUCT_OFFSET(VipsMax, y_array),
  498|      1|		VIPS_TYPE_ARRAY_INT);
  499|      1|}

maxpair.c:vips_maxpair_class_init:
  146|      1|{
  147|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  148|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  149|       |
  150|      1|	object_class->nickname = "maxpair";
  151|      1|	object_class->description = _("maximum of a pair of images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  152|       |
  153|      1|	aclass->process_line = maxpair_buffer;
  154|       |
  155|      1|	vips_arithmetic_set_format_table(aclass, vips_maxpair_format_table);
  156|      1|}

measure.c:vips_measure_class_init:
  182|      1|{
  183|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  184|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  185|       |
  186|      1|	gobject_class->set_property = vips_object_set_property;
  187|      1|	gobject_class->get_property = vips_object_get_property;
  188|       |
  189|      1|	object_class->nickname = "measure";
  190|      1|	object_class->description =
  191|      1|		_("measure a set of patches on a color chart");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  192|      1|	object_class->build = vips_measure_build;
  193|       |
  194|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  195|      1|		_("Input"),
  196|      1|		_("Image to measure"),
  197|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  198|      1|		G_STRUCT_OFFSET(VipsMeasure, in));
  199|       |
  200|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  201|      1|		_("Output"),
  202|      1|		_("Output array of statistics"),
  203|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  204|      1|		G_STRUCT_OFFSET(VipsMeasure, out));
  205|       |
  206|      1|	VIPS_ARG_INT(class, "h", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  207|      1|		_("Across"),
  208|      1|		_("Number of patches across chart"),
  209|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  210|      1|		G_STRUCT_OFFSET(VipsMeasure, h),
  211|      1|		1, VIPS_MAX_COORD, 1);
  212|       |
  213|      1|	VIPS_ARG_INT(class, "v", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  214|      1|		_("Down"),
  215|      1|		_("Number of patches down chart"),
  216|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  217|      1|		G_STRUCT_OFFSET(VipsMeasure, v),
  218|      1|		1, VIPS_MAX_COORD, 1);
  219|       |
  220|      1|	VIPS_ARG_INT(class, "left", 10,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  221|      1|		_("Left"),
  222|      1|		_("Left edge of extract area"),
  223|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  224|      1|		G_STRUCT_OFFSET(VipsMeasure, left),
  225|      1|		0, VIPS_MAX_COORD, 0);
  226|       |
  227|      1|	VIPS_ARG_INT(class, "top", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  228|      1|		_("Top"),
  229|      1|		_("Top edge of extract area"),
  230|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  231|      1|		G_STRUCT_OFFSET(VipsMeasure, top),
  232|      1|		0, VIPS_MAX_COORD, 0);
  233|       |
  234|      1|	VIPS_ARG_INT(class, "width", 12,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  235|      1|		_("Width"),
  236|      1|		_("Width of extract area"),
  237|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  238|      1|		G_STRUCT_OFFSET(VipsMeasure, width),
  239|      1|		1, VIPS_MAX_COORD, 1);
  240|       |
  241|      1|	VIPS_ARG_INT(class, "height", 13,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  242|      1|		_("Height"),
  243|      1|		_("Height of extract area"),
  244|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  245|      1|		G_STRUCT_OFFSET(VipsMeasure, height),
  246|      1|		1, VIPS_MAX_COORD, 1);
  247|      1|}

min.c:vips_min_class_init:
  435|      1|{
  436|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  437|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  438|      1|	VipsStatisticClass *sclass = VIPS_STATISTIC_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  439|       |
  440|      1|	gobject_class->set_property = vips_object_set_property;
  441|      1|	gobject_class->get_property = vips_object_get_property;
  442|       |
  443|      1|	object_class->nickname = "min";
  444|      1|	object_class->description = _("find image minimum");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  445|      1|	object_class->build = vips_min_build;
  446|       |
  447|      1|	sclass->start = vips_min_start;
  448|      1|	sclass->scan = vips_min_scan;
  449|      1|	sclass->stop = vips_min_stop;
  450|       |
  451|      1|	VIPS_ARG_DOUBLE(class, "out", 1,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  452|      1|		_("Output"),
  453|      1|		_("Output value"),
  454|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  455|      1|		G_STRUCT_OFFSET(VipsMin, min),
  456|      1|		-INFINITY, INFINITY, 0.0);
  457|       |
  458|      1|	VIPS_ARG_INT(class, "x", 2,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  459|      1|		_("x"),
  460|      1|		_("Horizontal position of minimum"),
  461|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  462|      1|		G_STRUCT_OFFSET(VipsMin, x),
  463|      1|		0, VIPS_MAX_COORD, 0);
  464|       |
  465|      1|	VIPS_ARG_INT(class, "y", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  466|      1|		_("y"),
  467|      1|		_("Vertical position of minimum"),
  468|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  469|      1|		G_STRUCT_OFFSET(VipsMin, y),
  470|      1|		0, VIPS_MAX_COORD, 0);
  471|       |
  472|      1|	VIPS_ARG_INT(class, "size", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  473|      1|		_("Size"),
  474|      1|		_("Number of minimum values to find"),
  475|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  476|      1|		G_STRUCT_OFFSET(VipsMin, size),
  477|      1|		1, 1000000, 1);
  478|       |
  479|      1|	VIPS_ARG_BOXED(class, "out_array", 6,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  480|      1|		_("Output array"),
  481|      1|		_("Array of output values"),
  482|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  483|      1|		G_STRUCT_OFFSET(VipsMin, min_array),
  484|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  485|       |
  486|      1|	VIPS_ARG_BOXED(class, "x_array", 7,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  487|      1|		_("x array"),
  488|      1|		_("Array of horizontal positions"),
  489|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  490|      1|		G_STRUCT_OFFSET(VipsMin, x_array),
  491|      1|		VIPS_TYPE_ARRAY_INT);
  492|       |
  493|      1|	VIPS_ARG_BOXED(class, "y_array", 8,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  494|      1|		_("y array"),
  495|      1|		_("Array of vertical positions"),
  496|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  497|      1|		G_STRUCT_OFFSET(VipsMin, y_array),
  498|      1|		VIPS_TYPE_ARRAY_INT);
  499|      1|}

minpair.c:vips_minpair_class_init:
  146|      1|{
  147|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  148|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  149|       |
  150|      1|	object_class->nickname = "minpair";
  151|      1|	object_class->description = _("minimum of a pair of images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  152|       |
  153|      1|	aclass->process_line = minpair_buffer;
  154|       |
  155|      1|	vips_arithmetic_set_format_table(aclass, vips_minpair_format_table);
  156|      1|}

multiply.c:vips_multiply_class_init:
  190|      1|{
  191|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  192|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  193|       |
  194|      1|	object_class->nickname = "multiply";
  195|      1|	object_class->description = _("multiply two images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  196|       |
  197|      1|	aclass->process_line = vips_multiply_buffer;
  198|       |
  199|      1|	vips_arithmetic_set_format_table(aclass, vips_multiply_format_table);
  200|      1|}

nary.c:vips_nary_class_init:
   72|      1|{
   73|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   74|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|       |
   76|      1|	gobject_class->set_property = vips_object_set_property;
   77|      1|	gobject_class->get_property = vips_object_get_property;
   78|       |
   79|      1|	vobject_class->nickname = "nary";
   80|      1|	vobject_class->description = _("nary operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   81|      1|	vobject_class->build = vips_nary_build;
   82|       |
   83|       |	/* Create properties.
   84|       |	 */
   85|       |
   86|      1|	VIPS_ARG_BOXED(class, "in", 0,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
   87|      1|		_("Input"),
   88|      1|		_("Array of input images"),
   89|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
   90|      1|		G_STRUCT_OFFSET(VipsNary, in),
   91|      1|		VIPS_TYPE_ARRAY_IMAGE);
   92|      1|}

profile.c:vips_profile_class_init:
  284|      1|{
  285|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  286|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  287|      1|	VipsStatisticClass *sclass = VIPS_STATISTIC_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  288|       |
  289|      1|	gobject_class->set_property = vips_object_set_property;
  290|      1|	gobject_class->get_property = vips_object_get_property;
  291|       |
  292|      1|	object_class->nickname = "profile";
  293|      1|	object_class->description = _("find image profiles");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  294|      1|	object_class->build = vips_profile_build;
  295|       |
  296|      1|	sclass->start = vips_profile_start;
  297|      1|	sclass->scan = vips_profile_scan;
  298|      1|	sclass->stop = vips_profile_stop;
  299|       |
  300|      1|	VIPS_ARG_IMAGE(class, "columns", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  301|      1|		_("Columns"),
  302|      1|		_("First non-zero pixel in column"),
  303|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  304|      1|		G_STRUCT_OFFSET(VipsProfile, columns));
  305|       |
  306|      1|	VIPS_ARG_IMAGE(class, "rows", 101,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  307|      1|		_("Rows"),
  308|      1|		_("First non-zero pixel in row"),
  309|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  310|      1|		G_STRUCT_OFFSET(VipsProfile, rows));
  311|      1|}

project.c:vips_project_class_init:
  315|      1|{
  316|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  317|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  318|      1|	VipsStatisticClass *sclass = VIPS_STATISTIC_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  319|       |
  320|      1|	gobject_class->set_property = vips_object_set_property;
  321|      1|	gobject_class->get_property = vips_object_get_property;
  322|       |
  323|      1|	object_class->nickname = "project";
  324|      1|	object_class->description = _("find image projections");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  325|      1|	object_class->build = vips_project_build;
  326|       |
  327|      1|	sclass->start = vips_project_start;
  328|      1|	sclass->scan = vips_project_scan;
  329|      1|	sclass->stop = vips_project_stop;
  330|       |
  331|      1|	VIPS_ARG_IMAGE(class, "columns", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  332|      1|		_("Columns"),
  333|      1|		_("Sums of columns"),
  334|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  335|      1|		G_STRUCT_OFFSET(VipsProject, columns));
  336|       |
  337|      1|	VIPS_ARG_IMAGE(class, "rows", 101,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  338|      1|		_("Rows"),
  339|      1|		_("Sums of rows"),
  340|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  341|      1|		G_STRUCT_OFFSET(VipsProject, rows));
  342|      1|}

relational.c:vips_relational_class_init:
  229|      1|{
  230|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  232|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  233|       |
  234|      1|	gobject_class->set_property = vips_object_set_property;
  235|      1|	gobject_class->get_property = vips_object_get_property;
  236|       |
  237|      1|	object_class->nickname = "relational";
  238|      1|	object_class->description = _("relational operation on two images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  239|       |
  240|      1|	aclass->process_line = vips_relational_buffer;
  241|       |
  242|      1|	vips_arithmetic_set_format_table(aclass,
  243|      1|		vips_relational_format_table);
  244|       |
  245|      1|	VIPS_ARG_ENUM(class, "relational", 200,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  246|      1|		_("Operation"),
  247|      1|		_("Relational to perform"),
  248|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  249|      1|		G_STRUCT_OFFSET(VipsRelational, relational),
  250|      1|		VIPS_TYPE_OPERATION_RELATIONAL,
  251|      1|		VIPS_OPERATION_RELATIONAL_EQUAL);
  252|      1|}
relational.c:vips_relational_const_class_init:
  593|      1|{
  594|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  595|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  596|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  597|       |
  598|      1|	gobject_class->set_property = vips_object_set_property;
  599|      1|	gobject_class->get_property = vips_object_get_property;
  600|       |
  601|      1|	object_class->nickname = "relational_const";
  602|      1|	object_class->description =
  603|      1|		_("relational operations against a constant");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  604|       |
  605|      1|	aclass->process_line = vips_relational_const_buffer;
  606|       |
  607|      1|	vips_arithmetic_set_format_table(aclass,
  608|      1|		vips_relational_format_table);
  609|       |
  610|      1|	VIPS_ARG_ENUM(class, "relational", 200,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  611|      1|		_("Operation"),
  612|      1|		_("Relational to perform"),
  613|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  614|      1|		G_STRUCT_OFFSET(VipsRelationalConst, relational),
  615|      1|		VIPS_TYPE_OPERATION_RELATIONAL,
  616|      1|		VIPS_OPERATION_RELATIONAL_EQUAL);
  617|      1|}

remainder.c:vips_remainder_class_init:
  182|      1|{
  183|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  184|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  185|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  186|       |
  187|      1|	gobject_class->set_property = vips_object_set_property;
  188|      1|	gobject_class->get_property = vips_object_get_property;
  189|       |
  190|      1|	object_class->nickname = "remainder";
  191|      1|	object_class->description =
  192|      1|		_("remainder after integer division of two images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  193|      1|	object_class->build = vips_remainder_build;
  194|       |
  195|      1|	aclass->process_line = vips_remainder_buffer;
  196|       |
  197|      1|	vips_arithmetic_set_format_table(aclass,
  198|      1|		vips_remainder_format_table);
  199|      1|}
remainder.c:vips_remainder_const_class_init:
  343|      1|{
  344|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  345|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  346|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  347|       |
  348|      1|	gobject_class->set_property = vips_object_set_property;
  349|      1|	gobject_class->get_property = vips_object_get_property;
  350|       |
  351|      1|	object_class->nickname = "remainder_const";
  352|      1|	object_class->description =
  353|      1|		_("remainder after integer division of an image and a constant");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  354|      1|	object_class->build = vips_remainder_const_build;
  355|       |
  356|      1|	aclass->process_line = vips_remainder_const_buffer;
  357|       |
  358|      1|	vips_arithmetic_set_format_table(aclass, vips_remainder_format_table);
  359|      1|}

round.c:vips_round_class_init:
  164|      1|{
  165|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  166|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  167|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  168|       |
  169|      1|	gobject_class->set_property = vips_object_set_property;
  170|      1|	gobject_class->get_property = vips_object_get_property;
  171|       |
  172|      1|	object_class->nickname = "round";
  173|      1|	object_class->description = _("perform a round function on an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  174|      1|	object_class->build = vips_round_build;
  175|       |
  176|      1|	aclass->process_line = vips_round_buffer;
  177|       |
  178|      1|	vips_arithmetic_set_format_table(aclass, vips_round_format_table);
  179|       |
  180|      1|	VIPS_ARG_ENUM(class, "round", 200,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  181|      1|		_("Round operation"),
  182|      1|		_("Rounding operation to perform"),
  183|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  184|      1|		G_STRUCT_OFFSET(VipsRound, round),
  185|      1|		VIPS_TYPE_OPERATION_ROUND, VIPS_OPERATION_ROUND_RINT);
  186|      1|}

sign.c:vips_sign_class_init:
  169|      1|{
  170|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  171|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  172|       |
  173|      1|	object_class->nickname = "sign";
  174|      1|	object_class->description = _("unit vector of pixel");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  175|       |
  176|      1|	aclass->process_line = vips_sign_buffer;
  177|       |
  178|      1|	vips_arithmetic_set_format_table(aclass, vips_sign_format_table);
  179|      1|}

statistic.c:vips_statistic_class_init:
  152|      1|{
  153|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  154|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  155|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  156|       |
  157|      1|	gobject_class->set_property = vips_object_set_property;
  158|      1|	gobject_class->get_property = vips_object_get_property;
  159|       |
  160|      1|	vobject_class->nickname = "statistic";
  161|      1|	vobject_class->description = _("VIPS statistic operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  162|      1|	vobject_class->build = vips_statistic_build;
  163|       |
  164|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  165|       |
  166|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  167|      1|		_("Input"),
  168|      1|		_("Input image"),
  169|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  170|      1|		G_STRUCT_OFFSET(VipsStatistic, in));
  171|      1|}

stats.c:vips_stats_class_init:
  425|      1|{
  426|      1|	GObjectClass *gobject_class = (GObjectClass *) class;
  427|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  428|      1|	VipsStatisticClass *sclass = VIPS_STATISTIC_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  429|       |
  430|      1|	gobject_class->set_property = vips_object_set_property;
  431|      1|	gobject_class->get_property = vips_object_get_property;
  432|       |
  433|      1|	object_class->nickname = "stats";
  434|      1|	object_class->description = _("find many image stats");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  435|      1|	object_class->build = vips_stats_build;
  436|       |
  437|      1|	sclass->start = vips_stats_start;
  438|      1|	sclass->scan = vips_stats_scan;
  439|      1|	sclass->stop = vips_stats_stop;
  440|       |
  441|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  442|      1|		_("Output"),
  443|      1|		_("Output array of statistics"),
  444|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  445|      1|		G_STRUCT_OFFSET(VipsStats, out));
  446|      1|}

subtract.c:vips_subtract_class_init:
  169|      1|{
  170|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  171|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  172|       |
  173|      1|	object_class->nickname = "subtract";
  174|      1|	object_class->description = _("subtract two images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  175|       |
  176|      1|	aclass->process_line = vips_subtract_buffer;
  177|       |
  178|      1|	vips_arithmetic_set_format_table(aclass, vips_subtract_format_table);
  179|      1|}

sum.c:vips_sum_class_init:
  144|      1|{
  145|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  146|      1|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  147|       |
  148|      1|	object_class->nickname = "sum";
  149|      1|	object_class->description = _("sum an array of images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  150|       |
  151|      1|	aclass->process_line = sum_buffer;
  152|       |
  153|      1|	vips_arithmetic_set_format_table(aclass, vips_sum_format_table);
  154|      1|}

unary.c:vips_unary_class_init:
   73|      1|{
   74|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   76|       |
   77|      1|	gobject_class->set_property = vips_object_set_property;
   78|      1|	gobject_class->get_property = vips_object_get_property;
   79|       |
   80|      1|	vobject_class->nickname = "unary";
   81|      1|	vobject_class->description = _("unary operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   82|      1|	vobject_class->build = vips_unary_build;
   83|       |
   84|       |	/* Create properties.
   85|       |	 */
   86|       |
   87|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
   88|      1|		_("Input"),
   89|      1|		_("Input image"),
   90|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
   91|      1|		G_STRUCT_OFFSET(VipsUnary, in));
   92|      1|}
unary.c:vips_unary_build:
   55|  9.24k|{
   56|  9.24k|	VipsArithmetic *arithmetic = VIPS_ARITHMETIC(object);
  ------------------
  |  |   42|  9.24k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  9.24k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  9.24k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  9.24k|		VIPS_TYPE_ARITHMETIC, VipsArithmetic))
  ------------------
   57|  9.24k|	VipsUnary *unary = VIPS_UNARY(object);
  ------------------
  |  |   42|  9.24k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_UNARY, VipsUnary))
  |  |  ------------------
  |  |  |  |  484|  9.24k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  9.24k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   58|       |
   59|  9.24k|	arithmetic->n = 1;
   60|  9.24k|	arithmetic->in = (VipsImage **) vips_object_local_array(object, 1);
   61|  9.24k|	arithmetic->in[0] = unary->in;
   62|  9.24k|	if (arithmetic->in[0])
  ------------------
  |  Branch (62:6): [True: 9.24k, False: 0]
  ------------------
   63|  9.24k|		g_object_ref(arithmetic->in[0]);
   64|       |
   65|  9.24k|	if (VIPS_OBJECT_CLASS(vips_unary_parent_class)->build(object))
  ------------------
  |  |  435|  9.24k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  9.24k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  9.24k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (65:6): [True: 0, False: 9.24k]
  ------------------
   66|      0|		return -1;
   67|       |
   68|  9.24k|	return 0;
   69|  9.24k|}
unary.c:vips_unary_init:
   96|  9.24k|{
   97|       |	/* Init our instance fields.
   98|       |	 */
   99|  9.24k|}

unaryconst.c:vips_unary_const_class_init:
  130|      1|{
  131|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  133|       |
  134|      1|	gobject_class->set_property = vips_object_set_property;
  135|      1|	gobject_class->get_property = vips_object_get_property;
  136|       |
  137|      1|	object_class->nickname = "unary_const";
  138|      1|	object_class->description = _("unary operations with a constant");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  139|      1|	object_class->build = vips_unary_const_build;
  140|       |
  141|      1|	VIPS_ARG_BOXED(class, "c", 201,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  142|      1|		_("c"),
  143|      1|		_("Array of constants"),
  144|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  145|      1|		G_STRUCT_OFFSET(VipsUnaryConst, c),
  146|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  147|      1|}
unaryconst.c:vips_unary_const_build:
   57|    494|{
   58|    494|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    494|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    494|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    494|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   59|    494|	VipsArithmetic *arithmetic = VIPS_ARITHMETIC(object);
  ------------------
  |  |   42|    494|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    494|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    494|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|    494|		VIPS_TYPE_ARITHMETIC, VipsArithmetic))
  ------------------
   60|    494|	VipsUnary *unary = (VipsUnary *) object;
   61|    494|	VipsUnaryConst *uconst = (VipsUnaryConst *) object;
   62|       |
   63|       |	/* If we have a three-element vector we need to bandup the image to
   64|       |	 * match.
   65|       |	 */
   66|    494|	uconst->n = 1;
   67|    494|	if (uconst->c)
  ------------------
  |  Branch (67:6): [True: 494, False: 0]
  ------------------
   68|    494|		uconst->n = VIPS_MAX(uconst->n, uconst->c->n);
  ------------------
  |  |   54|    494|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 494]
  |  |  ------------------
  ------------------
   69|    494|	if (unary->in)
  ------------------
  |  Branch (69:6): [True: 494, False: 0]
  ------------------
   70|    494|		uconst->n = VIPS_MAX(uconst->n, unary->in->Bands);
  ------------------
  |  |   54|    494|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 494]
  |  |  ------------------
  ------------------
   71|    494|	arithmetic->base_bands = uconst->n;
   72|       |
   73|    494|	if (unary->in &&
  ------------------
  |  Branch (73:6): [True: 494, False: 0]
  ------------------
   74|    494|		uconst->c) {
  ------------------
  |  Branch (74:3): [True: 494, False: 0]
  ------------------
   75|    494|		if (vips_check_vector(class->nickname,
  ------------------
  |  Branch (75:7): [True: 0, False: 494]
  ------------------
   76|    494|				uconst->c->n, unary->in))
   77|      0|			return -1;
   78|    494|	}
   79|       |
   80|       |	/* Some operations need int constants, for example boolean AND, SHIFT
   81|       |	 * etc.
   82|       |	 *
   83|       |	 * Some can use int constants as an optimisation, for example (x <
   84|       |	 * 12). It depends on the value though: obviously (x < 12.5) should
   85|       |	 * not use the int form.
   86|       |	 *
   87|       |	 * For complex images, we double the vector length and set the
   88|       |	 * imaginary part to 0.
   89|       |	 */
   90|    494|	if (uconst->c) {
  ------------------
  |  Branch (90:6): [True: 494, False: 0]
  ------------------
   91|    494|		gboolean is_complex =
   92|    494|			vips_band_format_iscomplex(unary->in->BandFmt);
   93|    494|		int step = is_complex ? 2 : 1;
  ------------------
  |  Branch (93:14): [True: 0, False: 494]
  ------------------
   94|    494|		int n = step * uconst->n;
   95|    494|		double *c = (double *) uconst->c->data;
   96|       |
   97|    494|		int i;
   98|       |
   99|    494|		uconst->c_int = VIPS_ARRAY(object, n, int);
  ------------------
  |  |   72|    494|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    494|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    494|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    494|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    494|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  100|    494|		uconst->c_double = VIPS_ARRAY(object, n, double);
  ------------------
  |  |   72|    494|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    494|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    494|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    494|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    494|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  101|    494|		if (!uconst->c_int ||
  ------------------
  |  Branch (101:7): [True: 0, False: 494]
  ------------------
  102|    494|			!uconst->c_double)
  ------------------
  |  Branch (102:4): [True: 0, False: 494]
  ------------------
  103|      0|			return -1;
  104|    494|		memset(uconst->c_int, 0, n * sizeof(int));
  105|    494|		memset(uconst->c_double, 0, n * sizeof(double));
  106|       |
  107|  2.01k|		for (i = 0; i < n; i += step)
  ------------------
  |  Branch (107:15): [True: 1.52k, False: 494]
  ------------------
  108|  1.52k|			uconst->c_double[i] =
  109|  1.52k|				c[VIPS_MIN(i / step, uconst->c->n - 1)];
  ------------------
  |  |   55|  1.52k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 1.52k]
  |  |  ------------------
  ------------------
  110|       |
  111|  2.01k|		for (i = 0; i < n; i += step)
  ------------------
  |  Branch (111:15): [True: 1.52k, False: 494]
  ------------------
  112|  1.52k|			uconst->c_int[i] = uconst->c_double[i];
  113|       |
  114|    494|		uconst->is_int = TRUE;
  ------------------
  |  |  798|    494|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    494|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  115|  2.01k|		for (i = 0; i < n; i += step)
  ------------------
  |  Branch (115:15): [True: 1.52k, False: 494]
  ------------------
  116|  1.52k|			if (uconst->c_int[i] != uconst->c_double[i]) {
  ------------------
  |  Branch (116:8): [True: 0, False: 1.52k]
  ------------------
  117|      0|				uconst->is_int = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  118|      0|				break;
  119|      0|			}
  120|    494|	}
  121|       |
  122|    494|	if (VIPS_OBJECT_CLASS(vips_unary_const_parent_class)->build(object))
  ------------------
  |  |  435|    494|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    494|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    494|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (122:6): [True: 0, False: 494]
  ------------------
  123|      0|		return -1;
  124|       |
  125|    494|	return 0;
  126|    494|}
unaryconst.c:vips_unary_const_init:
  151|    494|{
  152|    494|}

CMYK2XYZ.c:vips_CMYK2XYZ_class_init:
  105|      1|{
  106|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  107|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  108|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  109|       |
  110|      1|	gobject_class->set_property = vips_object_set_property;
  111|      1|	gobject_class->get_property = vips_object_get_property;
  112|       |
  113|      1|	object_class->nickname = "CMYK2XYZ";
  114|      1|	object_class->description = _("transform CMYK to XYZ");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  115|       |
  116|      1|	object_class->build = vips_CMYK2XYZ_build;
  117|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  118|       |
  119|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  120|      1|		_("Input"),
  121|      1|		_("Input image"),
  122|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  123|      1|		G_STRUCT_OFFSET(VipsCMYK2XYZ, in));
  124|       |
  125|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  126|      1|		_("Output"),
  127|      1|		_("Output image"),
  128|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  129|      1|		G_STRUCT_OFFSET(VipsCMYK2XYZ, out));
  130|      1|}

HSV2sRGB.c:vips_HSV2sRGB_class_init:
  107|      1|{
  108|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  109|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  110|       |
  111|      1|	object_class->nickname = "HSV2sRGB";
  112|      1|	object_class->description = _("transform HSV to sRGB");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  113|       |
  114|      1|	colour_class->process_line = vips_HSV2sRGB_line;
  115|      1|}

LCh2Lab.c:vips_LCh2Lab_class_init:
  106|      1|{
  107|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  108|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  109|       |
  110|      1|	object_class->nickname = "LCh2Lab";
  111|      1|	object_class->description = _("transform LCh to Lab");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  112|       |
  113|      1|	colour_class->process_line = vips_LCh2Lab_line;
  114|      1|}

LCh2UCS.c:vips_LCh2CMC_class_init:
  201|      1|{
  202|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  203|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  204|       |
  205|      1|	object_class->nickname = "LCh2CMC";
  206|      1|	object_class->description = _("transform LCh to CMC");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  207|       |
  208|      1|	colour_class->process_line = vips_LCh2CMC_line;
  209|      1|}

Lab2LCh.c:vips_Lab2LCh_class_init:
  127|      1|{
  128|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  129|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  130|       |
  131|      1|	object_class->nickname = "Lab2LCh";
  132|      1|	object_class->description = _("transform Lab to LCh");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  133|       |
  134|      1|	colour_class->process_line = vips_Lab2LCh_line;
  135|      1|}

Lab2LabQ.c:vips_Lab2LabQ_class_init:
  132|      1|{
  133|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  134|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  135|       |
  136|      1|	object_class->nickname = "Lab2LabQ";
  137|      1|	object_class->description = _("transform float Lab to LabQ coding");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  138|       |
  139|      1|	colour_class->process_line = vips_Lab2LabQ_line;
  140|      1|}

Lab2LabS.c:vips_Lab2LabS_class_init:
   77|      1|{
   78|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
   79|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
   80|       |
   81|      1|	object_class->nickname = "Lab2LabS";
   82|      1|	object_class->description = _("transform float Lab to signed short");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   83|       |
   84|      1|	colour_class->process_line = vips_Lab2LabS_line;
   85|      1|}

vips_Lab2XYZ:
  219|     45|{
  220|     45|	va_list ap;
  221|     45|	int result;
  222|       |
  223|     45|	va_start(ap, out);
  224|     45|	result = vips_call_split("Lab2XYZ", ap, in, out);
  225|     45|	va_end(ap);
  226|       |
  227|     45|	return result;
  228|     45|}
vips_col_Lab2XYZ:
  245|   262k|{
  246|   262k|	VipsLab2XYZ Lab2XYZ;
  247|       |
  248|   262k|	Lab2XYZ.X0 = VIPS_D65_X0;
  ------------------
  |  |   58|   262k|#define VIPS_D65_X0 (95.0470)
  ------------------
  249|   262k|	Lab2XYZ.Y0 = VIPS_D65_Y0;
  ------------------
  |  |   59|   262k|#define VIPS_D65_Y0 (100.0)
  ------------------
  250|   262k|	Lab2XYZ.Z0 = VIPS_D65_Z0;
  ------------------
  |  |   60|   262k|#define VIPS_D65_Z0 (108.8827)
  ------------------
  251|   262k|	vips_col_Lab2XYZ_helper(&Lab2XYZ, L, a, b, X, Y, Z);
  252|   262k|}
Lab2XYZ.c:vips_Lab2XYZ_class_init:
  168|      1|{
  169|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  170|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  171|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  172|       |
  173|      1|	gobject_class->set_property = vips_object_set_property;
  174|      1|	gobject_class->get_property = vips_object_get_property;
  175|       |
  176|      1|	object_class->nickname = "Lab2XYZ";
  177|      1|	object_class->description = _("transform CIELAB to XYZ");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  178|      1|	object_class->build = vips_Lab2XYZ_build;
  179|       |
  180|      1|	colour_class->process_line = vips_Lab2XYZ_line;
  181|       |
  182|      1|	VIPS_ARG_BOXED(class, "temp", 110,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  183|      1|		_("Temperature"),
  184|      1|		_("Color temperature"),
  185|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  186|      1|		G_STRUCT_OFFSET(VipsLab2XYZ, temp),
  187|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  188|      1|}
Lab2XYZ.c:vips_Lab2XYZ_build:
  147|     45|{
  148|     45|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|     45|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|     45|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|     45|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  149|     45|	VipsLab2XYZ *Lab2XYZ = (VipsLab2XYZ *) object;
  150|       |
  151|     45|	if (Lab2XYZ->temp) {
  ------------------
  |  Branch (151:6): [True: 0, False: 45]
  ------------------
  152|      0|		if (vips_check_vector_length(class->nickname,
  ------------------
  |  Branch (152:7): [True: 0, False: 0]
  ------------------
  153|      0|				Lab2XYZ->temp->n, 3))
  154|      0|			return -1;
  155|      0|		Lab2XYZ->X0 = ((double *) Lab2XYZ->temp->data)[0];
  156|      0|		Lab2XYZ->Y0 = ((double *) Lab2XYZ->temp->data)[1];
  157|      0|		Lab2XYZ->Z0 = ((double *) Lab2XYZ->temp->data)[2];
  158|      0|	}
  159|       |
  160|     45|	if (VIPS_OBJECT_CLASS(vips_Lab2XYZ_parent_class)->build(object))
  ------------------
  |  |  435|     45|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|     45|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|     45|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (160:6): [True: 0, False: 45]
  ------------------
  161|      0|		return -1;
  162|       |
  163|     45|	return 0;
  164|     45|}
Lab2XYZ.c:vips_Lab2XYZ_line:
  115|  1.48k|{
  116|  1.48k|	VipsLab2XYZ *Lab2XYZ = (VipsLab2XYZ *) colour;
  117|  1.48k|	float *restrict p = (float *) in[0];
  118|  1.48k|	float *restrict q = (float *) out;
  119|       |
  120|  1.48k|	int x;
  121|       |
  122|  1.48k|	VIPS_DEBUG_MSG("vips_Lab2XYZ_line: X0 = %g, Y0 = %g, Z0 = %g\n",
  ------------------
  |  |   47|  1.48k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.48k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  1.48k|	{ \
  |  |   49|  1.48k|		; \
  |  |   50|  1.48k|	} \
  |  |   51|  1.48k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.48k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  123|  1.48k|		Lab2XYZ->X0, Lab2XYZ->Y0, Lab2XYZ->Z0);
  124|       |
  125|  48.4k|	for (x = 0; x < width; x++) {
  ------------------
  |  Branch (125:14): [True: 46.9k, False: 1.48k]
  ------------------
  126|  46.9k|		float L, a, b;
  127|  46.9k|		float X, Y, Z;
  128|       |
  129|  46.9k|		L = p[0];
  130|  46.9k|		a = p[1];
  131|  46.9k|		b = p[2];
  132|  46.9k|		p += 3;
  133|       |
  134|  46.9k|		vips_col_Lab2XYZ_helper(Lab2XYZ, L, a, b, &X, &Y, &Z);
  135|       |
  136|       |		/* Write.
  137|       |		 */
  138|  46.9k|		q[0] = X;
  139|  46.9k|		q[1] = Y;
  140|  46.9k|		q[2] = Z;
  141|  46.9k|		q += 3;
  142|  46.9k|	}
  143|  1.48k|}
Lab2XYZ.c:vips_Lab2XYZ_init:
  192|     45|{
  193|     45|	VipsColour *colour = VIPS_COLOUR(Lab2XYZ);
  ------------------
  |  |   42|     45|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     45|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     45|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|     45|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  194|       |
  195|     45|	Lab2XYZ->X0 = VIPS_D65_X0;
  ------------------
  |  |   58|     45|#define VIPS_D65_X0 (95.0470)
  ------------------
  196|     45|	Lab2XYZ->Y0 = VIPS_D65_Y0;
  ------------------
  |  |   59|     45|#define VIPS_D65_Y0 (100.0)
  ------------------
  197|     45|	Lab2XYZ->Z0 = VIPS_D65_Z0;
  ------------------
  |  |   60|     45|#define VIPS_D65_Z0 (108.8827)
  ------------------
  198|       |
  199|     45|	colour->interpretation = VIPS_INTERPRETATION_XYZ;
  200|     45|}
Lab2XYZ.c:vips_col_Lab2XYZ_helper:
   86|   309k|{
   87|   309k|	double cby, tmp;
   88|       |
   89|   309k|	if (L < 8.0) {
  ------------------
  |  Branch (89:6): [True: 69.6k, False: 239k]
  ------------------
   90|  69.6k|		*Y = (L * Lab2XYZ->Y0) / 903.3;
   91|  69.6k|		cby = 7.787 * (*Y / Lab2XYZ->Y0) + 16.0 / 116.0;
   92|  69.6k|	}
   93|   239k|	else {
   94|   239k|		cby = (L + 16.0) / 116.0;
   95|   239k|		*Y = Lab2XYZ->Y0 * cby * cby * cby;
   96|   239k|	}
   97|       |
   98|   309k|	tmp = a / 500.0 + cby;
   99|   309k|	if (tmp < 0.2069)
  ------------------
  |  Branch (99:6): [True: 78.1k, False: 230k]
  ------------------
  100|  78.1k|		*X = Lab2XYZ->X0 * (tmp - 0.13793) / 7.787;
  101|   230k|	else
  102|   230k|		*X = Lab2XYZ->X0 * tmp * tmp * tmp;
  103|       |
  104|   309k|	tmp = cby - b / 200.0;
  105|   309k|	if (tmp < 0.2069)
  ------------------
  |  Branch (105:6): [True: 104k, False: 204k]
  ------------------
  106|   104k|		*Z = Lab2XYZ->Z0 * (tmp - 0.13793) / 7.787;
  107|   204k|	else
  108|   204k|		*Z = Lab2XYZ->Z0 * tmp * tmp * tmp;
  109|   309k|}

vips_LabQ2Lab:
  158|      1|{
  159|      1|	va_list ap;
  160|      1|	int result;
  161|       |
  162|      1|	va_start(ap, out);
  163|      1|	result = vips_call_split("LabQ2Lab", ap, in, out);
  164|      1|	va_end(ap);
  165|       |
  166|      1|	return result;
  167|      1|}
LabQ2Lab.c:vips_LabQ2Lab_class_init:
  120|      1|{
  121|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  122|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  123|       |
  124|      1|	object_class->nickname = "LabQ2Lab";
  125|      1|	object_class->description = _("unpack a LabQ image to float Lab");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  126|       |
  127|      1|	colour_class->process_line = vips_LabQ2Lab_line;
  128|      1|}
LabQ2Lab.c:vips_LabQ2Lab_init:
  132|      1|{
  133|      1|	VipsColour *colour = VIPS_COLOUR(LabQ2Lab);
  ------------------
  |  |   42|      1|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|      1|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      1|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|      1|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  134|      1|	VipsColourCode *code = VIPS_COLOUR_CODE(LabQ2Lab);
  ------------------
  |  |  135|      1|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|      1|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      1|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|      1|		VIPS_TYPE_COLOUR_CODE, VipsColourCode))
  ------------------
  135|       |
  136|      1|	colour->coding = VIPS_CODING_NONE;
  137|      1|	colour->interpretation = VIPS_INTERPRETATION_LAB;
  138|      1|	colour->format = VIPS_FORMAT_FLOAT;
  139|      1|	colour->bands = 3;
  140|       |
  141|      1|	code->input_coding = VIPS_CODING_LABQ;
  142|      1|}
LabQ2Lab.c:vips_LabQ2Lab_line:
   76|     49|{
   77|     49|	signed char *restrict p = (signed char *) in[0];
   78|     49|	float *restrict q = (float *) out;
   79|       |
   80|     49|	int l;
   81|     49|	int lsbs; /* for lsbs byte */
   82|     49|	int i;	  /* counter      */
   83|       |
   84|       |	/* Read input with a signed pointer to get signed ab easily.
   85|       |	 */
   86|  2.15k|	for (i = 0; i < width; i++) {
  ------------------
  |  Branch (86:14): [True: 2.10k, False: 49]
  ------------------
   87|       |		/* Get extra bits.
   88|       |		 */
   89|  2.10k|		lsbs = ((unsigned char *) p)[3];
   90|       |
   91|       |		/* Build L.
   92|       |		 */
   93|  2.10k|		l = ((unsigned char *) p)[0];
   94|  2.10k|		l = (l << 2) | (lsbs >> 6);
   95|  2.10k|		q[0] = (float) l * (100.0 / 1023.0);
   96|       |
   97|       |		/* Build a.
   98|       |		 */
   99|  2.10k|		l = VIPS_LSHIFT_INT(p[1], 3) | ((lsbs >> 3) & 0x7);
  ------------------
  |  |   87|  2.10k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  100|  2.10k|		q[1] = (float) l * 0.125;
  101|       |
  102|       |		/* And b.
  103|       |		 */
  104|  2.10k|		l = VIPS_LSHIFT_INT(p[2], 3) | (lsbs & 0x7);
  ------------------
  |  |   87|  2.10k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  105|  2.10k|		q[2] = (float) l * 0.125;
  106|       |
  107|  2.10k|		p += 4;
  108|  2.10k|		q += 3;
  109|  2.10k|	}
  110|     49|}

LabQ2LabS.c:vips_LabQ2LabS_class_init:
   99|      1|{
  100|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  101|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  102|       |
  103|      1|	object_class->nickname = "LabQ2LabS";
  104|      1|	object_class->description = _("unpack a LabQ image to short Lab");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  105|       |
  106|      1|	colour_class->process_line = vips_LabQ2LabS_line;
  107|      1|}

vips_col_make_tables_RGB_8:
  171|  2.88M|{
  172|  2.88M|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|  2.88M|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
  173|       |
  174|  2.88M|	VIPS_ONCE(&once, calcul_tables_8, NULL);
  ------------------
  |  |   93|  2.88M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.88M|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|  2.88M|	{ \
  |  |   95|  2.88M|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|  2.88M|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|  2.88M| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  2.88M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|  2.88M|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|  2.88M|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 2.88M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|  2.88M|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|  2.88M|   else                                         \
  |  |  |  |  |  |  931|  2.88M|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|  2.88M|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|  2.88M|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 2.88M]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|  2.88M|			(void) g_once(ONCE, FUNC, CLIENT); \
  |  |  ------------------
  |  |  |  |  241|      1|  (((once)->status == G_ONCE_STATUS_READY) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (241:4): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  |  |  242|      1|   (once)->retval : \
  |  |  |  |  243|      1|   g_once_impl ((once), (func), (arg)))
  |  |  ------------------
  |  |   97|  2.88M|	} \
  |  |   98|  2.88M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.88M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  175|  2.88M|}
vips_col_XYZ2scRGB:
  262|  2.81M|{
  263|  2.81M|	X /= SCALE;
  ------------------
  |  |  212|  2.81M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  2.81M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  264|  2.81M|	Y /= SCALE;
  ------------------
  |  |  212|  2.81M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  2.81M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  265|  2.81M|	Z /= SCALE;
  ------------------
  |  |  212|  2.81M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  2.81M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  266|       |
  267|       |	/* Use 6 decimal places of precision for the inverse matrix.
  268|       |	 */
  269|  2.81M|	*R = 3.240625 * X +
  270|  2.81M|		-1.537208 * Y +
  271|  2.81M|		-0.498629 * Z;
  272|  2.81M|	*G = -0.968931 * X +
  273|  2.81M|		1.875756 * Y +
  274|  2.81M|		0.041518 * Z;
  275|  2.81M|	*B = 0.055710 * X +
  276|  2.81M|		-0.204021 * Y +
  277|  2.81M|		1.056996 * Z;
  278|       |
  279|  2.81M|	return 0;
  280|  2.81M|}
vips_col_scRGB2sRGB_8:
  363|  2.88M|{
  364|  2.88M|	vips_col_make_tables_RGB_8();
  365|       |
  366|  2.88M|	return vips_col_scRGB2sRGB(256, vips_Y2v_8, R, G, B, r, g, b, og);
  367|  2.88M|}
vips_LabQ2sRGB:
  582|     27|{
  583|     27|	va_list ap;
  584|     27|	int result;
  585|       |
  586|     27|	va_start(ap, out);
  587|     27|	result = vips_call_split("LabQ2sRGB", ap, in, out);
  588|     27|	va_end(ap);
  589|       |
  590|     27|	return result;
  591|     27|}
LabQ2sRGB.c:vips_LabQ2sRGB_class_init:
  544|      1|{
  545|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  546|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  547|       |
  548|      1|	object_class->nickname = "LabQ2sRGB";
  549|      1|	object_class->description = _("convert a LabQ image to sRGB");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  550|       |
  551|      1|	colour_class->process_line = vips_LabQ2sRGB_line;
  552|      1|}
LabQ2sRGB.c:vips_LabQ2sRGB_line:
  491|    619|{
  492|    619|	unsigned char *p = (unsigned char *) in[0];
  493|       |
  494|    619|	int i, t;
  495|       |
  496|       |	/* Current error.
  497|       |	 */
  498|    619|	int le = 0;
  499|    619|	int ae = 0;
  500|    619|	int be = 0;
  501|       |
  502|    619|	vips_col_make_tables_LabQ2sRGB();
  503|       |
  504|  20.0k|	for (i = 0; i < width; i++) {
  ------------------
  |  Branch (504:14): [True: 19.4k, False: 619]
  ------------------
  505|       |		/* Get colour, add in error from previous pixel.
  506|       |		 */
  507|  19.4k|		int L = p[0] + le;
  508|  19.4k|		int A = (signed char) p[1] + ae;
  509|  19.4k|		int B = (signed char) p[2] + be;
  510|       |
  511|  19.4k|		p += 4;
  512|       |
  513|       |		/* Look out for overflow.
  514|       |		 */
  515|  19.4k|		L = VIPS_MIN(255, L);
  ------------------
  |  |   55|  19.4k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 647, False: 18.8k]
  |  |  ------------------
  ------------------
  516|  19.4k|		A = VIPS_MIN(127, A);
  ------------------
  |  |   55|  19.4k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 110, False: 19.3k]
  |  |  ------------------
  ------------------
  517|  19.4k|		B = VIPS_MIN(127, B);
  ------------------
  |  |   55|  19.4k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 90, False: 19.3k]
  |  |  ------------------
  ------------------
  518|       |
  519|       |		/* Find new quant error. This will always be +ve.
  520|       |		 */
  521|  19.4k|		le = L & 3;
  522|  19.4k|		ae = A & 3;
  523|  19.4k|		be = B & 3;
  524|       |
  525|       |		/* Scale to 0-63.
  526|       |		 */
  527|  19.4k|		L = (L >> 2) & 63;
  528|  19.4k|		A = (A >> 2) & 63;
  529|  19.4k|		B = (B >> 2) & 63;
  530|       |
  531|       |		/* Convert to RGB.
  532|       |		 */
  533|  19.4k|		t = INDEX(L, A, B);
  ------------------
  |  |   96|  19.4k|#define INDEX(L, A, B) (L + (A << 6) + (B << 12))
  ------------------
  534|  19.4k|		q[0] = vips_red[t];
  535|  19.4k|		q[1] = vips_green[t];
  536|  19.4k|		q[2] = vips_blue[t];
  537|       |
  538|  19.4k|		q += 3;
  539|  19.4k|	}
  540|    619|}
LabQ2sRGB.c:vips_col_make_tables_LabQ2sRGB:
  481|    619|{
  482|    619|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|    619|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
  483|       |
  484|    619|	VIPS_ONCE(&once, build_tables, NULL);
  ------------------
  |  |   93|    619|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    619|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|    619|	{ \
  |  |   95|    619|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|    619|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|    619| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|    619|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|    619|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|    619|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 618]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|    619|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|    619|   else                                         \
  |  |  |  |  |  |  931|    619|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|    619|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|    619|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 618]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|    619|			(void) g_once(ONCE, FUNC, CLIENT); \
  |  |  ------------------
  |  |  |  |  241|      1|  (((once)->status == G_ONCE_STATUS_READY) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (241:4): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  |  |  242|      1|   (once)->retval : \
  |  |  |  |  243|      1|   g_once_impl ((once), (func), (arg)))
  |  |  ------------------
  |  |   97|    619|	} \
  |  |   98|    619|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    619|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  485|    619|}
LabQ2sRGB.c:build_tables:
  448|      1|{
  449|      1|	int l, a, b;
  450|      1|	int t;
  451|       |
  452|     65|	for (l = 0; l < 64; l++) {
  ------------------
  |  Branch (452:14): [True: 64, False: 1]
  ------------------
  453|  4.16k|		for (a = 0; a < 64; a++) {
  ------------------
  |  Branch (453:15): [True: 4.09k, False: 64]
  ------------------
  454|   266k|			for (b = 0; b < 64; b++) {
  ------------------
  |  Branch (454:16): [True: 262k, False: 4.09k]
  ------------------
  455|       |				/* Scale to lab space.
  456|       |				 */
  457|   262k|				float L = (l << 2) * (100.0 / 256.0);
  458|   262k|				float A = (signed char) (a << 2);
  459|   262k|				float B = (signed char) (b << 2);
  460|   262k|				float X, Y, Z;
  461|   262k|				float Rf, Gf, Bf;
  462|   262k|				int rb, gb, bb;
  463|       |
  464|   262k|				vips_col_Lab2XYZ(L, A, B, &X, &Y, &Z);
  465|   262k|				vips_col_XYZ2scRGB(X, Y, Z, &Rf, &Gf, &Bf);
  466|   262k|				vips_col_scRGB2sRGB_8(Rf, Gf, Bf, &rb, &gb, &bb, NULL);
  467|       |
  468|   262k|				t = INDEX(l, a, b);
  ------------------
  |  |   96|   262k|#define INDEX(L, A, B) (L + (A << 6) + (B << 12))
  ------------------
  469|   262k|				vips_red[t] = rb;
  470|   262k|				vips_green[t] = gb;
  471|   262k|				vips_blue[t] = bb;
  472|   262k|			}
  473|  4.09k|		}
  474|     64|	}
  475|       |
  476|      1|	return NULL;
  477|      1|}
LabQ2sRGB.c:vips_LabQ2sRGB_init:
  556|     27|{
  557|     27|	VipsColour *colour = VIPS_COLOUR(LabQ2sRGB);
  ------------------
  |  |   42|     27|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     27|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     27|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|     27|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  558|     27|	VipsColourCode *code = VIPS_COLOUR_CODE(LabQ2sRGB);
  ------------------
  |  |  135|     27|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     27|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     27|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|     27|		VIPS_TYPE_COLOUR_CODE, VipsColourCode))
  ------------------
  559|       |
  560|     27|	colour->coding = VIPS_CODING_NONE;
  561|     27|	colour->interpretation = VIPS_INTERPRETATION_sRGB;
  562|     27|	colour->format = VIPS_FORMAT_UCHAR;
  563|     27|	colour->bands = 3;
  564|       |
  565|     27|	code->input_coding = VIPS_CODING_LABQ;
  566|     27|}
LabQ2sRGB.c:calcul_tables_8:
  163|      1|{
  164|      1|	calcul_tables(256, vips_Y2v_8, vips_v2Y_8);
  165|       |
  166|      1|	return NULL;
  167|      1|}
LabQ2sRGB.c:calcul_tables:
  131|      1|{
  132|      1|	int i;
  133|       |
  134|    257|	for (i = 0; i < range; i++) {
  ------------------
  |  Branch (134:14): [True: 256, False: 1]
  ------------------
  135|    256|		float f = (float) i / (range - 1);
  136|    256|		float v;
  137|       |
  138|    256|		if (f <= 0.0031308)
  ------------------
  |  Branch (138:7): [True: 1, False: 255]
  ------------------
  139|      1|			v = 12.92 * f;
  140|    255|		else
  141|    255|			v = (1.0 + 0.055) * pow(f, 1.0 / 2.4) - 0.055;
  142|       |
  143|    256|		Y2v[i] = VIPS_RINT((range - 1) * v);
  ------------------
  |  |   74|    256|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  144|    256|	}
  145|       |
  146|       |	/* Copy the final element. This is used in the piecewise linear
  147|       |	 * interpolator below.
  148|       |	 */
  149|      1|	Y2v[range] = Y2v[range - 1];
  150|       |
  151|    257|	for (i = 0; i < range; i++) {
  ------------------
  |  Branch (151:14): [True: 256, False: 1]
  ------------------
  152|    256|		float f = (float) i / (range - 1);
  153|       |
  154|    256|		if (f <= 0.04045)
  ------------------
  |  Branch (154:7): [True: 11, False: 245]
  ------------------
  155|     11|			v2Y[i] = f / 12.92;
  156|    245|		else
  157|    245|			v2Y[i] = pow((f + 0.055) / (1 + 0.055), 2.4);
  158|    256|	}
  159|      1|}
LabQ2sRGB.c:vips_col_scRGB2sRGB:
  292|  2.88M|{
  293|  2.88M|	int maxval = range - 1;
  294|       |
  295|  2.88M|	int og;
  296|  2.88M|	float Yf;
  297|  2.88M|	int Yi;
  298|  2.88M|	float v;
  299|       |
  300|       |	/* RGB can be NaN. Throw those values out, they will break
  301|       |	 * our clipping.
  302|       |	 *
  303|       |	 * Don't use isnormal(), it is false for 0.0 and for subnormal
  304|       |	 * numbers.
  305|       |	 */
  306|  2.88M|	if (VIPS_ISNAN(R) || VIPS_ISNAN(G) || VIPS_ISNAN(B)) {
  ------------------
  |  |   71|  5.76M|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (71:23): [True: 5.25k, False: 2.87M]
  |  |  ------------------
  ------------------
              	if (VIPS_ISNAN(R) || VIPS_ISNAN(G) || VIPS_ISNAN(B)) {
  ------------------
  |  |   71|  5.76M|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (71:23): [True: 2.27k, False: 2.87M]
  |  |  ------------------
  ------------------
              	if (VIPS_ISNAN(R) || VIPS_ISNAN(G) || VIPS_ISNAN(B)) {
  ------------------
  |  |   71|  2.87M|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (71:23): [True: 1.48k, False: 2.87M]
  |  |  ------------------
  ------------------
  307|  9.01k|		*r = 0;
  308|  9.01k|		*g = 0;
  309|  9.01k|		*b = 0;
  310|       |
  311|  9.01k|		return -1;
  312|  9.01k|	}
  313|       |
  314|       |	/* Clip range, set the out-of-gamut flag.
  315|       |	 */
  316|  2.87M|#define CLIP(L, V, H) \
  317|  2.87M|	{ \
  318|  2.87M|		if ((V) < (L)) { \
  319|  2.87M|			(V) = (L); \
  320|  2.87M|			og = 1; \
  321|  2.87M|		} \
  322|  2.87M|		else if ((V) > (H)) { \
  323|  2.87M|			(V) = (H); \
  324|  2.87M|			og = 1; \
  325|  2.87M|		} \
  326|  2.87M|	}
  327|       |
  328|       |	/* Look up with a float index: interpolate between the nearest two
  329|       |	 * points.
  330|       |	 *
  331|       |	 * The +1 on the index is safe, see above.
  332|       |	 */
  333|       |
  334|  2.87M|	og = 0;
  335|       |
  336|  2.87M|	Yf = R * maxval;
  337|  2.87M|	CLIP(0, Yf, maxval);
  ------------------
  |  |  317|  2.87M|	{ \
  |  |  318|  2.87M|		if ((V) < (L)) { \
  |  |  ------------------
  |  |  |  Branch (318:7): [True: 351k, False: 2.52M]
  |  |  ------------------
  |  |  319|   351k|			(V) = (L); \
  |  |  320|   351k|			og = 1; \
  |  |  321|   351k|		} \
  |  |  322|  2.87M|		else if ((V) > (H)) { \
  |  |  ------------------
  |  |  |  Branch (322:12): [True: 153k, False: 2.36M]
  |  |  ------------------
  |  |  323|   153k|			(V) = (H); \
  |  |  324|   153k|			og = 1; \
  |  |  325|   153k|		} \
  |  |  326|  2.87M|	}
  ------------------
  338|  2.87M|	Yi = (int) Yf;
  339|  2.87M|	v = lut[Yi] + (lut[Yi + 1] - lut[Yi]) * (Yf - Yi);
  340|  2.87M|	*r = VIPS_RINT(v);
  ------------------
  |  |   74|  2.87M|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  341|       |
  342|  2.87M|	Yf = G * maxval;
  343|  2.87M|	CLIP(0, Yf, maxval);
  ------------------
  |  |  317|  2.87M|	{ \
  |  |  318|  2.87M|		if ((V) < (L)) { \
  |  |  ------------------
  |  |  |  Branch (318:7): [True: 137k, False: 2.73M]
  |  |  ------------------
  |  |  319|   137k|			(V) = (L); \
  |  |  320|   137k|			og = 1; \
  |  |  321|   137k|		} \
  |  |  322|  2.87M|		else if ((V) > (H)) { \
  |  |  ------------------
  |  |  |  Branch (322:12): [True: 135k, False: 2.60M]
  |  |  ------------------
  |  |  323|   135k|			(V) = (H); \
  |  |  324|   135k|			og = 1; \
  |  |  325|   135k|		} \
  |  |  326|  2.87M|	}
  ------------------
  344|  2.87M|	Yi = (int) Yf;
  345|  2.87M|	v = lut[Yi] + (lut[Yi + 1] - lut[Yi]) * (Yf - Yi);
  346|  2.87M|	*g = VIPS_RINT(v);
  ------------------
  |  |   74|  2.87M|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  347|       |
  348|  2.87M|	Yf = B * maxval;
  349|  2.87M|	CLIP(0, Yf, maxval);
  ------------------
  |  |  317|  2.87M|	{ \
  |  |  318|  2.87M|		if ((V) < (L)) { \
  |  |  ------------------
  |  |  |  Branch (318:7): [True: 169k, False: 2.70M]
  |  |  ------------------
  |  |  319|   169k|			(V) = (L); \
  |  |  320|   169k|			og = 1; \
  |  |  321|   169k|		} \
  |  |  322|  2.87M|		else if ((V) > (H)) { \
  |  |  ------------------
  |  |  |  Branch (322:12): [True: 182k, False: 2.52M]
  |  |  ------------------
  |  |  323|   182k|			(V) = (H); \
  |  |  324|   182k|			og = 1; \
  |  |  325|   182k|		} \
  |  |  326|  2.87M|	}
  ------------------
  350|  2.87M|	Yi = (int) Yf;
  351|  2.87M|	v = lut[Yi] + (lut[Yi + 1] - lut[Yi]) * (Yf - Yi);
  352|  2.87M|	*b = VIPS_RINT(v);
  ------------------
  |  |   74|  2.87M|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  353|       |
  354|  2.87M|	if (og_ret)
  ------------------
  |  Branch (354:6): [True: 0, False: 2.87M]
  ------------------
  355|      0|		*og_ret = og;
  356|       |
  357|  2.87M|	return 0;
  358|  2.88M|}

vips_LabS2Lab:
  112|     43|{
  113|     43|	va_list ap;
  114|     43|	int result;
  115|       |
  116|     43|	va_start(ap, out);
  117|     43|	result = vips_call_split("LabS2Lab", ap, in, out);
  118|     43|	va_end(ap);
  119|       |
  120|     43|	return result;
  121|     43|}
LabS2Lab.c:vips_LabS2Lab_class_init:
   73|      1|{
   74|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
   75|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
   76|       |
   77|      1|	object_class->nickname = "LabS2Lab";
   78|      1|	object_class->description = _("transform signed short Lab to float");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   79|       |
   80|      1|	colour_class->process_line = vips_LabS2Lab_line;
   81|      1|}
LabS2Lab.c:vips_LabS2Lab_line:
   56|  1.40k|{
   57|  1.40k|	signed short *p = (signed short *) in[0];
   58|  1.40k|	float *q = (float *) out;
   59|  1.40k|	int i;
   60|       |
   61|  47.7k|	for (i = 0; i < width; i++) {
  ------------------
  |  Branch (61:14): [True: 46.3k, False: 1.40k]
  ------------------
   62|  46.3k|		q[0] = p[0] / (32767.0 / 100.0);
   63|  46.3k|		q[1] = p[1] / (32768.0 / 128.0);
   64|  46.3k|		q[2] = p[2] / (32768.0 / 128.0);
   65|       |
   66|  46.3k|		p += 3;
   67|  46.3k|		q += 3;
   68|  46.3k|	}
   69|  1.40k|}
LabS2Lab.c:vips_LabS2Lab_init:
   85|     43|{
   86|     43|	VipsColour *colour = VIPS_COLOUR(LabS2Lab);
  ------------------
  |  |   42|     43|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     43|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     43|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|     43|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
   87|     43|	VipsColourCode *code = VIPS_COLOUR_CODE(LabS2Lab);
  ------------------
  |  |  135|     43|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     43|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     43|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|     43|		VIPS_TYPE_COLOUR_CODE, VipsColourCode))
  ------------------
   88|       |
   89|     43|	colour->interpretation = VIPS_INTERPRETATION_LAB;
   90|     43|	colour->format = VIPS_FORMAT_FLOAT;
   91|     43|	colour->input_bands = 3;
   92|     43|	colour->bands = 3;
   93|       |
   94|     43|	code->input_coding = VIPS_CODING_NONE;
   95|     43|	code->input_format = VIPS_FORMAT_SHORT;
   96|     43|}

LabS2LabQ.c:vips_LabS2LabQ_class_init:
  122|      1|{
  123|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  124|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  125|       |
  126|      1|	object_class->nickname = "LabS2LabQ";
  127|      1|	object_class->description = _("transform short Lab to LabQ coding");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  128|       |
  129|      1|	colour_class->process_line = vips_LabS2LabQ_line;
  130|      1|}

UCS2LCh.c:vips_CMC2LCh_class_init:
  268|      1|{
  269|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  270|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  271|       |
  272|      1|	object_class->nickname = "CMC2LCh";
  273|      1|	object_class->description = _("transform LCh to CMC");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  274|       |
  275|      1|	colour_class->process_line = vips_CMC2LCh_line;
  276|      1|}

XYZ2CMYK.c:vips_XYZ2CMYK_class_init:
  104|      1|{
  105|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  106|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  107|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  108|       |
  109|      1|	gobject_class->set_property = vips_object_set_property;
  110|      1|	gobject_class->get_property = vips_object_get_property;
  111|       |
  112|      1|	object_class->nickname = "XYZ2CMYK";
  113|      1|	object_class->description = _("transform XYZ to CMYK");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  114|       |
  115|      1|	object_class->build = vips_XYZ2CMYK_build;
  116|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  117|       |
  118|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  119|      1|		_("Input"),
  120|      1|		_("Input image"),
  121|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  122|      1|		G_STRUCT_OFFSET(VipsXYZ2CMYK, in));
  123|       |
  124|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  125|      1|		_("Output"),
  126|      1|		_("Output image"),
  127|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  128|      1|		G_STRUCT_OFFSET(VipsXYZ2CMYK, out));
  129|      1|}

XYZ2Lab.c:vips_XYZ2Lab_class_init:
  221|      1|{
  222|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  224|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  225|       |
  226|      1|	gobject_class->set_property = vips_object_set_property;
  227|      1|	gobject_class->get_property = vips_object_get_property;
  228|       |
  229|      1|	object_class->nickname = "XYZ2Lab";
  230|      1|	object_class->description = _("transform XYZ to Lab");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  231|      1|	object_class->build = vips_XYZ2Lab_build;
  232|       |
  233|      1|	colour_class->process_line = vips_XYZ2Lab_line;
  234|       |
  235|      1|	VIPS_ARG_BOXED(class, "temp", 110,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  236|      1|		_("Temperature"),
  237|      1|		_("Colour temperature"),
  238|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  239|      1|		G_STRUCT_OFFSET(VipsXYZ2Lab, temp),
  240|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  241|      1|}

XYZ2Yxy.c:vips_XYZ2Yxy_class_init:
   93|      1|{
   94|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
   95|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
   96|       |
   97|      1|	object_class->nickname = "XYZ2Yxy";
   98|      1|	object_class->description = _("transform XYZ to Yxy");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   99|       |
  100|      1|	colour_class->process_line = vips_XYZ2Yxy_line;
  101|      1|}

vips_XYZ2scRGB:
  229|    696|{
  230|    696|	va_list ap;
  231|    696|	int result;
  232|       |
  233|    696|	va_start(ap, out);
  234|    696|	result = vips_call_split("XYZ2scRGB", ap, in, out);
  235|    696|	va_end(ap);
  236|       |
  237|    696|	return result;
  238|    696|}
XYZ2scRGB.c:vips_XYZ2scRGB_class_init:
  185|      1|{
  186|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  187|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  188|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  189|       |
  190|      1|	gobject_class->set_property = vips_object_set_property;
  191|      1|	gobject_class->get_property = vips_object_get_property;
  192|       |
  193|      1|	object_class->nickname = "XYZ2scRGB";
  194|      1|	object_class->description = _("transform XYZ to scRGB");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  195|      1|	object_class->build = vips_XYZ2scRGB_build;
  196|       |
  197|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  198|       |
  199|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  200|      1|		_("Input"),
  201|      1|		_("Input image"),
  202|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  203|      1|		G_STRUCT_OFFSET(VipsXYZ2scRGB, in));
  204|       |
  205|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  206|      1|		_("Output"),
  207|      1|		_("Output image"),
  208|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  209|      1|		G_STRUCT_OFFSET(VipsXYZ2scRGB, out));
  210|      1|}
XYZ2scRGB.c:vips_XYZ2scRGB_build:
  142|    696|{
  143|    696|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    696|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    696|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    696|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|    696|	VipsXYZ2scRGB *XYZ2scRGB = (VipsXYZ2scRGB *) object;
  145|       |
  146|    696|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 2);
  147|       |
  148|    696|	VipsImage *in;
  149|    696|	VipsImage *out;
  150|       |
  151|    696|	if (VIPS_OBJECT_CLASS(vips_XYZ2scRGB_parent_class)->build(object))
  ------------------
  |  |  435|    696|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    696|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    696|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (151:6): [True: 0, False: 696]
  ------------------
  152|      0|		return -1;
  153|       |
  154|    696|	in = XYZ2scRGB->in;
  155|    696|	if (vips_check_bands_atleast(class->nickname, in, 3))
  ------------------
  |  Branch (155:6): [True: 0, False: 696]
  ------------------
  156|      0|		return -1;
  157|       |
  158|    696|	if (vips_cast_float(in, &t[0], NULL))
  ------------------
  |  Branch (158:6): [True: 0, False: 696]
  ------------------
  159|      0|		return -1;
  160|    696|	in = t[0];
  161|       |
  162|    696|	out = vips_image_new();
  163|    696|	if (vips_image_pipelinev(out,
  ------------------
  |  Branch (163:6): [True: 0, False: 696]
  ------------------
  164|    696|			VIPS_DEMAND_STYLE_THINSTRIP, in, NULL)) {
  165|      0|		g_object_unref(out);
  166|      0|		return -1;
  167|      0|	}
  168|    696|	out->Type = VIPS_INTERPRETATION_scRGB;
  169|    696|	out->BandFmt = VIPS_FORMAT_FLOAT;
  170|       |
  171|    696|	if (vips_image_generate(out,
  ------------------
  |  Branch (171:6): [True: 0, False: 696]
  ------------------
  172|    696|			vips_start_one, vips_XYZ2scRGB_gen, vips_stop_one,
  173|    696|			in, XYZ2scRGB)) {
  174|      0|		g_object_unref(out);
  175|      0|		return -1;
  176|      0|	}
  177|       |
  178|    696|	g_object_set(object, "out", out, NULL);
  179|       |
  180|    696|	return 0;
  181|    696|}
XYZ2scRGB.c:vips_XYZ2scRGB_gen:
  114|  2.63k|{
  115|  2.63k|	VipsRegion *ir = (VipsRegion *) seq;
  116|  2.63k|	VipsRect *r = &out_region->valid;
  117|  2.63k|	VipsImage *in = ir->im;
  118|       |
  119|  2.63k|	int y;
  120|       |
  121|  2.63k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (121:6): [True: 242, False: 2.38k]
  ------------------
  122|    242|		return -1;
  123|       |
  124|  2.63k|	VIPS_GATE_START("vips_XYZ2scRGB: work");
  ------------------
  |  |   41|  2.38k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.38k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.38k|	{ \
  |  |   43|  2.38k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 2.38k]
  |  |  ------------------
  |  |   44|  2.38k|			vips__thread_gate_start(NAME); \
  |  |   45|  2.38k|	} \
  |  |   46|  2.63k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.63k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  125|       |
  126|  35.6k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (126:14): [True: 33.2k, False: 2.38k]
  ------------------
  127|  33.2k|		float *p = (float *)
  128|  33.2k|			VIPS_REGION_ADDR(ir, r->left, r->top + y);
  ------------------
  |  |  227|  33.2k|	((R)->data + \
  |  |  228|  33.2k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  33.2k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  33.2k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  33.2k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  33.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  33.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  129|  33.2k|		float *q = (float *)
  130|  33.2k|			VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|  33.2k|	((R)->data + \
  |  |  228|  33.2k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  33.2k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  33.2k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  33.2k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  33.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  33.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  131|       |
  132|  33.2k|		vips_XYZ2scRGB_line(q, p, in->Bands - 3, r->width);
  133|  33.2k|	}
  134|       |
  135|  2.38k|	VIPS_GATE_STOP("vips_XYZ2scRGB: work");
  ------------------
  |  |   49|  2.38k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.38k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  2.38k|	{ \
  |  |   51|  2.38k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 2.38k]
  |  |  ------------------
  |  |   52|  2.38k|			vips__thread_gate_stop(NAME); \
  |  |   53|  2.38k|	} \
  |  |   54|  2.38k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.38k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  136|       |
  137|  2.38k|	return 0;
  138|  2.63k|}
XYZ2scRGB.c:vips_XYZ2scRGB_line:
   84|  33.2k|{
   85|  33.2k|	int i, j;
   86|       |
   87|  2.59M|	for (i = 0; i < width; i++) {
  ------------------
  |  Branch (87:14): [True: 2.55M, False: 33.2k]
  ------------------
   88|  2.55M|		const float X = p[0];
   89|  2.55M|		const float Y = p[1];
   90|  2.55M|		const float Z = p[2];
   91|       |
   92|  2.55M|		float R, G, B;
   93|       |
   94|  2.55M|		p += 3;
   95|       |
   96|  2.55M|		vips_col_XYZ2scRGB(X, Y, Z, &R, &G, &B);
   97|       |
   98|  2.55M|		q[0] = R;
   99|  2.55M|		q[1] = G;
  100|  2.55M|		q[2] = B;
  101|       |
  102|  2.55M|		q += 3;
  103|       |
  104|  2.70M|		for (j = 0; j < extra_bands; j++)
  ------------------
  |  Branch (104:15): [True: 150k, False: 2.55M]
  ------------------
  105|  2.55M|			q[j] = VIPS_CLIP(0, p[j] / 255.0, 1.0);
  ------------------
  |  |   57|   150k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|   300k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 1.57k, False: 148k]
  |  |  |  |  |  Branch (54:32): [True: 1.50k, False: 148k]
  |  |  |  |  |  Branch (54:44): [True: 1.50k, False: 147k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  106|  2.55M|		p += extra_bands;
  107|  2.55M|		q += extra_bands;
  108|  2.55M|	}
  109|  33.2k|}
XYZ2scRGB.c:vips_XYZ2scRGB_init:
  214|    696|{
  215|    696|}

Yxy2XYZ.c:vips_Yxy2XYZ_class_init:
   98|      1|{
   99|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  100|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  101|       |
  102|      1|	object_class->nickname = "Yxy2XYZ";
  103|      1|	object_class->description = _("transform Yxy to XYZ");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  104|       |
  105|      1|	colour_class->process_line = vips_Yxy2XYZ_line;
  106|      1|}

vips_colour_operation_init:
  712|      2|{
  713|      2|	extern GType vips_colourspace_get_type(void);
  714|      2|	extern GType vips_Lab2XYZ_get_type(void);
  715|      2|	extern GType vips_XYZ2Lab_get_type(void);
  716|      2|	extern GType vips_Lab2LCh_get_type(void);
  717|      2|	extern GType vips_LCh2Lab_get_type(void);
  718|      2|	extern GType vips_LCh2CMC_get_type(void);
  719|      2|	extern GType vips_CMC2LCh_get_type(void);
  720|      2|	extern GType vips_Yxy2XYZ_get_type(void);
  721|      2|	extern GType vips_XYZ2Yxy_get_type(void);
  722|      2|	extern GType vips_LabQ2Lab_get_type(void);
  723|      2|	extern GType vips_Lab2LabQ_get_type(void);
  724|      2|	extern GType vips_LabQ2LabS_get_type(void);
  725|      2|	extern GType vips_LabS2LabQ_get_type(void);
  726|      2|	extern GType vips_LabS2Lab_get_type(void);
  727|      2|	extern GType vips_Lab2LabS_get_type(void);
  728|      2|	extern GType vips_rad2float_get_type(void);
  729|      2|	extern GType vips_float2rad_get_type(void);
  730|      2|	extern GType vips_LabQ2sRGB_get_type(void);
  731|      2|	extern GType vips_XYZ2sRGB_get_type(void);
  732|      2|	extern GType vips_sRGB2scRGB_get_type(void);
  733|      2|	extern GType vips_sRGB2HSV_get_type(void);
  734|      2|	extern GType vips_HSV2sRGB_get_type(void);
  735|      2|	extern GType vips_scRGB2XYZ_get_type(void);
  736|      2|	extern GType vips_scRGB2BW_get_type(void);
  737|      2|	extern GType vips_XYZ2scRGB_get_type(void);
  738|      2|	extern GType vips_scRGB2sRGB_get_type(void);
  739|      2|	extern GType vips_CMYK2XYZ_get_type(void);
  740|      2|	extern GType vips_XYZ2CMYK_get_type(void);
  741|      2|	extern GType vips_profile_load_get_type(void);
  742|      2|#ifdef HAVE_LCMS2
  743|      2|	extern GType vips_icc_import_get_type(void);
  744|      2|	extern GType vips_icc_export_get_type(void);
  745|      2|	extern GType vips_icc_transform_get_type(void);
  746|      2|#endif
  747|      2|	extern GType vips_dE76_get_type(void);
  748|      2|	extern GType vips_dE00_get_type(void);
  749|      2|	extern GType vips_dECMC_get_type(void);
  750|       |
  751|      2|	vips_colourspace_get_type();
  752|      2|	vips_Lab2XYZ_get_type();
  753|      2|	vips_XYZ2Lab_get_type();
  754|      2|	vips_Lab2LCh_get_type();
  755|      2|	vips_LCh2Lab_get_type();
  756|      2|	vips_LCh2CMC_get_type();
  757|      2|	vips_CMC2LCh_get_type();
  758|      2|	vips_XYZ2Yxy_get_type();
  759|      2|	vips_Yxy2XYZ_get_type();
  760|      2|	vips_LabQ2Lab_get_type();
  761|      2|	vips_Lab2LabQ_get_type();
  762|      2|	vips_LabQ2LabS_get_type();
  763|      2|	vips_LabS2LabQ_get_type();
  764|      2|	vips_LabS2Lab_get_type();
  765|      2|	vips_Lab2LabS_get_type();
  766|      2|	vips_rad2float_get_type();
  767|      2|	vips_float2rad_get_type();
  768|      2|	vips_LabQ2sRGB_get_type();
  769|      2|	vips_sRGB2scRGB_get_type();
  770|      2|	vips_scRGB2XYZ_get_type();
  771|      2|	vips_scRGB2BW_get_type();
  772|      2|	vips_sRGB2HSV_get_type();
  773|      2|	vips_HSV2sRGB_get_type();
  774|      2|	vips_XYZ2scRGB_get_type();
  775|      2|	vips_scRGB2sRGB_get_type();
  776|      2|	vips_CMYK2XYZ_get_type();
  777|      2|	vips_XYZ2CMYK_get_type();
  778|      2|	vips_profile_load_get_type();
  779|      2|#ifdef HAVE_LCMS2
  780|      2|	vips_icc_import_get_type();
  781|      2|	vips_icc_export_get_type();
  782|      2|	vips_icc_transform_get_type();
  783|      2|#endif
  784|      2|	vips_dE76_get_type();
  785|      2|	vips_dE00_get_type();
  786|      2|	vips_dECMC_get_type();
  787|      2|}
colour.c:vips_colour_class_init:
  400|      1|{
  401|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  402|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  403|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  404|       |
  405|      1|	gobject_class->set_property = vips_object_set_property;
  406|      1|	gobject_class->get_property = vips_object_get_property;
  407|       |
  408|      1|	vobject_class->nickname = "colour";
  409|      1|	vobject_class->description = _("color operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  410|      1|	vobject_class->build = vips_colour_build;
  411|       |
  412|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  413|       |
  414|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  415|      1|		_("Output"),
  416|      1|		_("Output image"),
  417|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  418|      1|		G_STRUCT_OFFSET(VipsColour, out));
  419|      1|}
colour.c:vips_colour_build:
  267|    746|{
  268|    746|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    746|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    746|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    746|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  269|    746|	VipsColour *colour = VIPS_COLOUR(object);
  ------------------
  |  |   42|    746|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    746|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    746|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|    746|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  270|       |
  271|    746|	VipsImage **in;
  272|    746|	VipsImage **extra_bands;
  273|    746|	VipsImage *out;
  274|       |
  275|    746|	int i;
  276|       |
  277|       |#ifdef DEBUG
  278|       |	printf("vips_colour_build: ");
  279|       |	vips_object_print_name(object);
  280|       |	printf("\n");
  281|       |#endif /*DEBUG*/
  282|       |
  283|    746|	if (VIPS_OBJECT_CLASS(vips_colour_parent_class)->build(object))
  ------------------
  |  |  435|    746|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    746|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    746|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (283:6): [True: 0, False: 746]
  ------------------
  284|      0|		return -1;
  285|       |
  286|    746|	if (colour->n > MAX_INPUT_IMAGES) {
  ------------------
  |  |  223|    746|#define MAX_INPUT_IMAGES (64)
  ------------------
  |  Branch (286:6): [True: 0, False: 746]
  ------------------
  287|      0|		vips_error(class->nickname,
  288|      0|			"%s", _("too many input images"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  289|      0|		return -1;
  290|      0|	}
  291|  1.49k|	for (i = 0; i < colour->n; i++)
  ------------------
  |  Branch (291:14): [True: 746, False: 746]
  ------------------
  292|    746|		if (vips_image_pio_input(colour->in[i]))
  ------------------
  |  Branch (292:7): [True: 0, False: 746]
  ------------------
  293|      0|			return -1;
  294|       |
  295|       |	/* colour->in[] must be NULL-terminated, we can use it as an arg to
  296|       |	 * vips_start_many().
  297|       |	 */
  298|    746|	g_assert(!colour->in[colour->n]);
  ------------------
  |  |  166|    746|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    746|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    746|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  299|       |
  300|    746|	in = colour->in;
  301|    746|	extra_bands = (VipsImage **)
  302|    746|		vips_object_local_array(object, colour->n);
  303|       |
  304|       |	/* If there are more than @input_bands bands, we detach and reattach
  305|       |	 * after processing.
  306|       |	 */
  307|    746|	if (colour->input_bands > 0) {
  ------------------
  |  Branch (307:6): [True: 616, False: 130]
  ------------------
  308|    616|		VipsImage **new_in = (VipsImage **)
  309|    616|			vips_object_local_array(object, colour->n);
  310|       |
  311|  1.23k|		for (i = 0; i < colour->n; i++) {
  ------------------
  |  Branch (311:15): [True: 616, False: 616]
  ------------------
  312|    616|			if (vips_check_bands_atleast(class->nickname,
  ------------------
  |  Branch (312:8): [True: 0, False: 616]
  ------------------
  313|    616|					in[i], colour->input_bands))
  314|      0|				return -1;
  315|       |
  316|    616|			if (in[i]->Bands > colour->input_bands) {
  ------------------
  |  Branch (316:8): [True: 88, False: 528]
  ------------------
  317|     88|				if (vips_extract_band(in[i], &new_in[i], 0,
  ------------------
  |  Branch (317:9): [True: 0, False: 88]
  ------------------
  318|     88|						"n", colour->input_bands,
  319|     88|						NULL))
  320|      0|					return -1;
  321|     88|			}
  322|    528|			else {
  323|    528|				new_in[i] = in[i];
  324|    528|				g_object_ref(new_in[i]);
  325|    528|			}
  326|       |
  327|    616|			if (in[i]->Bands > colour->input_bands)
  ------------------
  |  Branch (327:8): [True: 88, False: 528]
  ------------------
  328|     88|				if (vips_extract_band(in[i], &extra_bands[i],
  ------------------
  |  Branch (328:9): [True: 0, False: 88]
  ------------------
  329|     88|						colour->input_bands,
  330|     88|						"n", in[i]->Bands - colour->input_bands,
  331|     88|						NULL))
  332|      0|					return -1;
  333|    616|		}
  334|       |
  335|    616|		in = new_in;
  336|    616|	}
  337|       |
  338|    746|	out = vips_image_new();
  339|    746|	if (vips_image_pipeline_array(out,
  ------------------
  |  Branch (339:6): [True: 0, False: 746]
  ------------------
  340|    746|			VIPS_DEMAND_STYLE_THINSTRIP, in)) {
  341|      0|		g_object_unref(out);
  342|      0|		return -1;
  343|      0|	}
  344|    746|	out->Coding = colour->coding;
  345|    746|	out->Type = colour->interpretation;
  346|    746|	out->BandFmt = colour->format;
  347|    746|	out->Bands = colour->bands;
  348|       |
  349|    746|	if (colour->profile_filename &&
  ------------------
  |  Branch (349:6): [True: 0, False: 746]
  ------------------
  350|    746|		vips__profile_set(out, colour->profile_filename))
  ------------------
  |  Branch (350:3): [True: 0, False: 0]
  ------------------
  351|      0|		return -1;
  352|       |
  353|    746|	if (vips_image_generate(out,
  ------------------
  |  Branch (353:6): [True: 0, False: 746]
  ------------------
  354|    746|			vips_start_many, vips_colour_gen, vips_stop_many,
  355|    746|			in, colour)) {
  356|      0|		g_object_unref(out);
  357|      0|		return -1;
  358|      0|	}
  359|       |
  360|       |	/* Reattach higher bands, if necessary. If we have more than one input
  361|       |	 * image, just use the first extra bands.
  362|       |	 */
  363|  1.40k|	for (i = 0; i < colour->n; i++)
  ------------------
  |  Branch (363:14): [True: 746, False: 658]
  ------------------
  364|    746|		if (extra_bands[i]) {
  ------------------
  |  Branch (364:7): [True: 88, False: 658]
  ------------------
  365|     88|			VipsImage *t1, *t2;
  366|       |
  367|       |			/* We can't just reattach the extra bands: they might
  368|       |			 * be float (for example) and we might be trying to
  369|       |			 * make a short image. Cast extra to match the body of
  370|       |			 * the image.
  371|       |			 */
  372|       |
  373|     88|			if (vips_cast(extra_bands[i], &t1, out->BandFmt,
  ------------------
  |  Branch (373:8): [True: 0, False: 88]
  ------------------
  374|     88|					"shift", TRUE,
  ------------------
  |  |  798|     88|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|     88|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  375|     88|					NULL)) {
  376|      0|				g_object_unref(out);
  377|      0|				return -1;
  378|      0|			}
  379|       |
  380|     88|			if (vips_bandjoin2(out, t1, &t2,
  ------------------
  |  Branch (380:8): [True: 0, False: 88]
  ------------------
  381|     88|					NULL)) {
  382|      0|				g_object_unref(t1);
  383|      0|				g_object_unref(out);
  384|      0|				return -1;
  385|      0|			}
  386|     88|			g_object_unref(out);
  387|     88|			g_object_unref(t1);
  388|     88|			out = t2;
  389|       |
  390|     88|			break;
  391|     88|		}
  392|       |
  393|    746|	g_object_set(colour, "out", out, NULL);
  394|       |
  395|    746|	return 0;
  396|    746|}
colour.c:vips_colour_gen:
  228|  2.46k|{
  229|  2.46k|	VipsRegion **ir = (VipsRegion **) seq;
  230|  2.46k|	VipsColour *colour = VIPS_COLOUR(b);
  ------------------
  |  |   42|  2.46k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.46k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.46k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  2.46k|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  231|  2.46k|	VipsColourClass *class = VIPS_COLOUR_GET_CLASS(colour);
  ------------------
  |  |   52|  2.46k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  2.46k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  2.46k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|  2.46k|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  232|  2.46k|	VipsRect *r = &out_region->valid;
  233|       |
  234|  2.46k|	int i, y;
  235|  2.46k|	VipsPel *p[MAX_INPUT_IMAGES], *q;
  236|       |
  237|       |	/*
  238|       |	printf("vips_colour_gen: %s, "
  239|       |		   "left = %d, top = %d, width = %d, height = %d\n",
  240|       |		VIPS_OBJECT_CLASS(class)->nickname,
  241|       |		r->left, r->top, r->width, r->height);
  242|       |	*/
  243|       |
  244|  2.46k|	if (vips_reorder_prepare_many(out_region->im, ir, r))
  ------------------
  |  Branch (244:6): [True: 316, False: 2.14k]
  ------------------
  245|    316|		return -1;
  246|       |
  247|  2.46k|	VIPS_GATE_START("vips_colour_gen: work");
  ------------------
  |  |   41|  2.14k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.14k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.14k|	{ \
  |  |   43|  2.14k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 2.14k]
  |  |  ------------------
  |  |   44|  2.14k|			vips__thread_gate_start(NAME); \
  |  |   45|  2.14k|	} \
  |  |   46|  2.46k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.46k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  248|       |
  249|  31.2k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (249:14): [True: 29.0k, False: 2.14k]
  ------------------
  250|  58.1k|		for (i = 0; ir[i]; i++)
  ------------------
  |  Branch (250:15): [True: 29.0k, False: 29.0k]
  ------------------
  251|  29.0k|			p[i] = VIPS_REGION_ADDR(ir[i], r->left, r->top + y);
  ------------------
  |  |  227|  29.0k|	((R)->data + \
  |  |  228|  29.0k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  29.0k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  29.0k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  29.0k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  29.0k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  29.0k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  252|  29.0k|		p[i] = NULL;
  253|  29.0k|		q = VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|  29.0k|	((R)->data + \
  |  |  228|  29.0k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  29.0k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  29.0k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  29.0k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  29.0k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  29.0k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  254|       |
  255|  29.0k|		class->process_line(colour, q, p, r->width);
  256|  29.0k|	}
  257|       |
  258|  2.14k|	VIPS_GATE_STOP("vips_colour_gen: work");
  ------------------
  |  |   49|  2.14k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.14k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  2.14k|	{ \
  |  |   51|  2.14k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 2.14k]
  |  |  ------------------
  |  |   52|  2.14k|			vips__thread_gate_stop(NAME); \
  |  |   53|  2.14k|	} \
  |  |   54|  2.14k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.14k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  259|       |
  260|  2.14k|	VIPS_COUNT_PIXELS(out_region, VIPS_OBJECT_GET_CLASS(colour)->nickname);
  ------------------
  |  |  189|  2.14k|#define VIPS_COUNT_PIXELS(R, N) vips__region_count_pixels(R, N)
  ------------------
  261|       |
  262|  2.14k|	return 0;
  263|  2.46k|}
colour.c:vips_colour_init:
  423|    746|{
  424|    746|	colour->coding = VIPS_CODING_NONE;
  425|    746|	colour->interpretation = VIPS_INTERPRETATION_sRGB;
  426|    746|	colour->format = VIPS_FORMAT_UCHAR;
  427|    746|	colour->bands = 3;
  428|    746|	colour->input_bands = -1;
  429|    746|}
colour.c:vips_colour_transform_class_init:
  468|      1|{
  469|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  470|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  471|       |
  472|      1|	gobject_class->set_property = vips_object_set_property;
  473|      1|	gobject_class->get_property = vips_object_get_property;
  474|       |
  475|      1|	vobject_class->nickname = "space";
  476|      1|	vobject_class->description = _("color space transformations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  477|      1|	vobject_class->build = vips_colour_transform_build;
  478|       |
  479|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  480|      1|		_("Input"),
  481|      1|		_("Input image"),
  482|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  483|      1|		G_STRUCT_OFFSET(VipsColourTransform, in));
  484|      1|}
colour.c:vips_colour_transform_build:
  436|     45|{
  437|     45|	VipsColour *colour = VIPS_COLOUR(object);
  ------------------
  |  |   42|     45|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     45|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     45|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|     45|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  438|     45|	VipsColourTransform *transform = VIPS_COLOUR_TRANSFORM(object);
  ------------------
  |  |  103|     45|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     45|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     45|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  104|     45|		VIPS_TYPE_COLOUR_TRANSFORM, VipsColourTransform))
  ------------------
  439|     45|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 1);
  440|       |
  441|       |	/* We only process float.
  442|       |	 */
  443|     45|	if (transform->in &&
  ------------------
  |  Branch (443:6): [True: 45, False: 0]
  ------------------
  444|     45|		transform->in->BandFmt != VIPS_FORMAT_FLOAT) {
  ------------------
  |  Branch (444:3): [True: 1, False: 44]
  ------------------
  445|      1|		if (vips_cast_float(transform->in, &t[0], NULL))
  ------------------
  |  Branch (445:7): [True: 0, False: 1]
  ------------------
  446|      0|			return -1;
  447|      1|	}
  448|     44|	else {
  449|     44|		t[0] = transform->in;
  450|     44|		g_object_ref(t[0]);
  451|     44|	}
  452|       |
  453|       |	/* We always do 3 bands -> 3 bands.
  454|       |	 */
  455|     45|	colour->input_bands = 3;
  456|       |
  457|     45|	colour->n = 1;
  458|     45|	colour->in = t;
  459|       |
  460|     45|	if (VIPS_OBJECT_CLASS(vips_colour_transform_parent_class)->build(object))
  ------------------
  |  |  435|     45|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|     45|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|     45|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (460:6): [True: 0, False: 45]
  ------------------
  461|      0|		return -1;
  462|       |
  463|     45|	return 0;
  464|     45|}
colour.c:vips_colour_transform_init:
  488|     45|{
  489|     45|	VipsColour *colour = (VipsColour *) space;
  490|       |
  491|       |	/* What we write. interpretation should be overwritten in subclass
  492|       |	 * builds.
  493|       |	 */
  494|     45|	colour->coding = VIPS_CODING_NONE;
  495|     45|	colour->interpretation = VIPS_INTERPRETATION_LAB;
  496|     45|	colour->format = VIPS_FORMAT_FLOAT;
  497|     45|	colour->bands = 3;
  498|     45|}
colour.c:vips_colour_code_class_init:
  561|      1|{
  562|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  563|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  564|       |
  565|      1|	gobject_class->set_property = vips_object_set_property;
  566|      1|	gobject_class->get_property = vips_object_get_property;
  567|       |
  568|      1|	vobject_class->nickname = "code";
  569|      1|	vobject_class->description = _("change color coding");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  570|      1|	vobject_class->build = vips_colour_code_build;
  571|       |
  572|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  573|      1|		_("Input"),
  574|      1|		_("Input image"),
  575|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  576|      1|		G_STRUCT_OFFSET(VipsColourCode, in));
  577|      1|}
colour.c:vips_colour_code_build:
  504|    701|{
  505|    701|	VipsColour *colour = VIPS_COLOUR(object);
  ------------------
  |  |   42|    701|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    701|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    701|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|    701|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  506|    701|	VipsColourCode *code = VIPS_COLOUR_CODE(object);
  ------------------
  |  |  135|    701|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    701|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    701|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|    701|		VIPS_TYPE_COLOUR_CODE, VipsColourCode))
  ------------------
  507|    701|	VipsColourCodeClass *class = VIPS_COLOUR_CODE_GET_CLASS(object);
  ------------------
  |  |  145|    701|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|    701|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    701|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  146|    701|		VIPS_TYPE_COLOUR_CODE, VipsColourCodeClass))
  ------------------
  508|    701|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 6);
  509|       |
  510|    701|	VipsImage *in;
  511|       |
  512|    701|	in = code->in;
  513|       |
  514|       |	/* If this is a LABQ and the coder wants uncoded, unpack.
  515|       |	 */
  516|    701|	if (in &&
  ------------------
  |  Branch (516:6): [True: 701, False: 0]
  ------------------
  517|    701|		in->Coding == VIPS_CODING_LABQ &&
  ------------------
  |  Branch (517:3): [True: 28, False: 673]
  ------------------
  518|    701|		code->input_coding == VIPS_CODING_NONE) {
  ------------------
  |  Branch (518:3): [True: 0, False: 28]
  ------------------
  519|      0|		if (vips_LabQ2Lab(in, &t[0], NULL))
  ------------------
  |  Branch (519:7): [True: 0, False: 0]
  ------------------
  520|      0|			return -1;
  521|      0|		in = t[0];
  522|      0|	}
  523|       |
  524|    701|	if (in &&
  ------------------
  |  Branch (524:6): [True: 701, False: 0]
  ------------------
  525|    701|		vips_check_coding(VIPS_OBJECT_CLASS(class)->nickname,
  ------------------
  |  |  435|    701|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    701|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    701|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (525:3): [True: 0, False: 701]
  ------------------
  526|    701|			in, code->input_coding))
  527|      0|		return -1;
  528|       |
  529|    701|	if (in &&
  ------------------
  |  Branch (529:6): [True: 701, False: 0]
  ------------------
  530|    701|		code->input_coding == VIPS_CODING_NONE &&
  ------------------
  |  Branch (530:3): [True: 571, False: 130]
  ------------------
  531|    701|		code->input_format != VIPS_FORMAT_NOTSET &&
  ------------------
  |  Branch (531:3): [True: 571, False: 0]
  ------------------
  532|    701|		in->BandFmt != code->input_format) {
  ------------------
  |  Branch (532:3): [True: 2, False: 569]
  ------------------
  533|      2|		if (vips_cast(in, &t[3], code->input_format, NULL))
  ------------------
  |  Branch (533:7): [True: 0, False: 2]
  ------------------
  534|      0|			return -1;
  535|      2|		in = t[3];
  536|      2|	}
  537|       |
  538|    701|	if (in &&
  ------------------
  |  Branch (538:6): [True: 701, False: 0]
  ------------------
  539|    701|		code->input_coding == VIPS_CODING_NONE &&
  ------------------
  |  Branch (539:3): [True: 571, False: 130]
  ------------------
  540|    701|		code->input_interpretation != VIPS_INTERPRETATION_ERROR &&
  ------------------
  |  Branch (540:3): [True: 0, False: 571]
  ------------------
  541|    701|		in->Type != code->input_interpretation) {
  ------------------
  |  Branch (541:3): [True: 0, False: 0]
  ------------------
  542|      0|		if (vips_colourspace(in, &t[4],
  ------------------
  |  Branch (542:7): [True: 0, False: 0]
  ------------------
  543|      0|				code->input_interpretation, NULL))
  544|      0|			return -1;
  545|      0|		in = t[4];
  546|      0|	}
  547|       |
  548|    701|	colour->n = 1;
  549|    701|	colour->in = VIPS_ARRAY(object, 2, VipsImage *);
  ------------------
  |  |   72|    701|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    701|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    701|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    701|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    701|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  550|    701|	colour->in[0] = in;
  551|    701|	colour->in[1] = NULL;
  552|       |
  553|    701|	if (VIPS_OBJECT_CLASS(vips_colour_code_parent_class)->build(object))
  ------------------
  |  |  435|    701|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    701|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    701|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (553:6): [True: 0, False: 701]
  ------------------
  554|      0|		return -1;
  555|       |
  556|    701|	return 0;
  557|    701|}
colour.c:vips_colour_code_init:
  581|    701|{
  582|    701|	code->input_coding = VIPS_CODING_NONE;
  583|    701|	code->input_interpretation = VIPS_INTERPRETATION_ERROR;
  584|    701|	code->input_format = VIPS_FORMAT_NOTSET;
  585|    701|}
colour.c:vips_colour_difference_class_init:
  672|      1|{
  673|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  674|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  675|       |
  676|      1|	gobject_class->set_property = vips_object_set_property;
  677|      1|	gobject_class->get_property = vips_object_get_property;
  678|       |
  679|      1|	vobject_class->nickname = "difference";
  680|      1|	vobject_class->description = _("calculate color difference");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  681|      1|	vobject_class->build = vips_colour_difference_build;
  682|       |
  683|      1|	VIPS_ARG_IMAGE(class, "left", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  684|      1|		_("Left"),
  685|      1|		_("Left-hand input image"),
  686|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  687|      1|		G_STRUCT_OFFSET(VipsColourDifference, left));
  688|       |
  689|      1|	VIPS_ARG_IMAGE(class, "right", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  690|      1|		_("Right"),
  691|      1|		_("Right-hand input image"),
  692|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  693|      1|		G_STRUCT_OFFSET(VipsColourDifference, right));
  694|      1|}

vips__colourspace_process_n:
  118|  2.06k|{
  119|  2.06k|	if (in->Bands > n) {
  ------------------
  |  Branch (119:6): [True: 372, False: 1.69k]
  ------------------
  120|    372|		VipsImage *scope = vips_image_new();
  121|    372|		VipsImage **t = (VipsImage **)
  122|    372|			vips_object_local_array(VIPS_OBJECT(scope), 4);
  ------------------
  |  |  433|    372|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    372|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    372|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  123|       |
  124|    372|		if (vips_extract_band(in, &t[0], 0,
  ------------------
  |  Branch (124:7): [True: 0, False: 372]
  ------------------
  125|    372|				"n", n,
  126|    372|				NULL) ||
  127|    372|			vips_extract_band(in, &t[1], n,
  ------------------
  |  Branch (127:4): [True: 0, False: 372]
  ------------------
  128|    372|				"n", in->Bands - n,
  129|    372|				NULL) ||
  130|    372|			fn(t[0], &t[2], NULL) ||
  ------------------
  |  Branch (130:4): [True: 0, False: 372]
  ------------------
  131|    372|			vips_cast(t[1], &t[3], t[2]->BandFmt,
  ------------------
  |  Branch (131:4): [True: 0, False: 372]
  ------------------
  132|    372|				NULL) ||
  133|    372|			vips_bandjoin2(t[2], t[3], out, NULL)) {
  ------------------
  |  Branch (133:4): [True: 0, False: 372]
  ------------------
  134|      0|			g_object_unref(scope);
  135|      0|			return -1;
  136|      0|		}
  137|       |
  138|    372|		g_object_unref(scope);
  139|    372|	}
  140|  1.69k|	else if (in->Bands == n) {
  ------------------
  |  Branch (140:11): [True: 1.69k, False: 0]
  ------------------
  141|  1.69k|		if (fn(in, out, NULL))
  ------------------
  |  Branch (141:7): [True: 0, False: 1.69k]
  ------------------
  142|      0|			return -1;
  143|  1.69k|	}
  144|      0|	else {
  145|      0|		vips_error(domain, "%s", _("too few bands for operation"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  146|      0|		return -1;
  147|      0|	}
  148|       |
  149|  2.06k|	return 0;
  150|  2.06k|}
vips_colourspace_issupported:
  433|  1.30k|{
  434|  1.30k|	VipsInterpretation interpretation;
  435|  1.30k|	int i;
  436|       |
  437|       |	/* Treat RGB as sRGB. If you want some other treatment,
  438|       |	 * you'll need to use the icc funcs.
  439|       |	 */
  440|  1.30k|	interpretation = vips_image_guess_interpretation(image);
  441|  1.30k|	if (interpretation == VIPS_INTERPRETATION_RGB)
  ------------------
  |  Branch (441:6): [True: 0, False: 1.30k]
  ------------------
  442|      0|		interpretation = VIPS_INTERPRETATION_sRGB;
  443|       |
  444|  78.4k|	for (i = 0; i < VIPS_NUMBER(vips_colour_routes); i++)
  ------------------
  |  |   60|  78.4k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (444:14): [True: 78.4k, False: 32]
  ------------------
  445|  78.4k|		if (vips_colour_routes[i].from == interpretation)
  ------------------
  |  Branch (445:7): [True: 1.27k, False: 77.1k]
  ------------------
  446|  1.27k|			return TRUE;
  ------------------
  |  |  798|  1.27k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  1.27k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  447|       |
  448|     32|	return FALSE;
  ------------------
  |  |  794|     32|#define	FALSE	(0)
  ------------------
  449|  1.30k|}
vips_colourspace:
  616|  3.12k|{
  617|  3.12k|	va_list ap;
  618|  3.12k|	int result;
  619|       |
  620|  3.12k|	va_start(ap, space);
  621|  3.12k|	result = vips_call_split("colourspace", ap, in, out, space);
  622|  3.12k|	va_end(ap);
  623|       |
  624|  3.12k|	return result;
  625|  3.12k|}
colourspace.c:vips_RGB162sRGB:
   89|    256|{
   90|    256|	if (vips_cast(in, out, VIPS_FORMAT_UCHAR,
  ------------------
  |  Branch (90:6): [True: 0, False: 256]
  ------------------
   91|    256|			"shift", TRUE,
  ------------------
  |  |  798|    256|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    256|#define	FALSE	(0)
  |  |  ------------------
  ------------------
   92|    256|			NULL))
   93|      0|		return -1;
   94|    256|	(*out)->Type = VIPS_INTERPRETATION_sRGB;
   95|       |
   96|    256|	return 0;
   97|    256|}
colourspace.c:vips_GREY162RGB16:
  179|    213|{
  180|    213|	if (vips__colourspace_process_n("GREY162RGB16",
  ------------------
  |  Branch (180:6): [True: 0, False: 213]
  ------------------
  181|    213|			in, out, 1, vips_BW2sRGB_op))
  182|      0|		return -1;
  183|    213|	(*out)->Type = VIPS_INTERPRETATION_RGB16;
  184|       |
  185|    213|	return 0;
  186|    213|}
colourspace.c:vips_BW2sRGB_op:
  154|  2.06k|{
  155|  2.06k|	VipsImage *t[3];
  156|       |
  157|  2.06k|	t[0] = in;
  158|  2.06k|	t[1] = in;
  159|  2.06k|	t[2] = in;
  160|  2.06k|	if (vips_bandjoin(t, out, 3, NULL))
  ------------------
  |  Branch (160:6): [True: 0, False: 2.06k]
  ------------------
  161|      0|		return -1;
  162|       |
  163|  2.06k|	return 0;
  164|  2.06k|}
colourspace.c:vips_BW2sRGB:
  168|  1.85k|{
  169|  1.85k|	if (vips__colourspace_process_n("BW2sRGB",
  ------------------
  |  Branch (169:6): [True: 0, False: 1.85k]
  ------------------
  170|  1.85k|			in, out, 1, vips_BW2sRGB_op))
  171|      0|		return -1;
  172|  1.85k|	(*out)->Type = VIPS_INTERPRETATION_sRGB;
  173|       |
  174|  1.85k|	return 0;
  175|  1.85k|}
colourspace.c:vips_colourspace_class_init:
  542|      1|{
  543|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  544|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  545|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  546|       |
  547|      1|	gobject_class->set_property = vips_object_set_property;
  548|      1|	gobject_class->get_property = vips_object_get_property;
  549|       |
  550|      1|	vobject_class->nickname = "colourspace";
  551|      1|	vobject_class->description = _("convert to a new colorspace");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  552|      1|	vobject_class->build = vips_colourspace_build;
  553|       |
  554|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  555|       |
  556|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  557|      1|		_("Input"),
  558|      1|		_("Input image"),
  559|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  560|      1|		G_STRUCT_OFFSET(VipsColourspace, in));
  561|       |
  562|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  563|      1|		_("Output"),
  564|      1|		_("Output image"),
  565|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  566|      1|		G_STRUCT_OFFSET(VipsColourspace, out));
  567|       |
  568|      1|	VIPS_ARG_ENUM(class, "space", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  569|      1|		_("Space"),
  570|      1|		_("Destination color space"),
  571|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  572|      1|		G_STRUCT_OFFSET(VipsColourspace, space),
  573|      1|		VIPS_TYPE_INTERPRETATION, VIPS_INTERPRETATION_sRGB);
  574|       |
  575|      1|	VIPS_ARG_ENUM(class, "source_space", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  576|      1|		_("Source space"),
  577|      1|		_("Source color space"),
  578|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  579|      1|		G_STRUCT_OFFSET(VipsColourspace, source_space),
  580|      1|		VIPS_TYPE_INTERPRETATION, VIPS_INTERPRETATION_sRGB);
  581|      1|}
colourspace.c:vips_colourspace_build:
  466|  3.12k|{
  467|  3.12k|	VipsColourspace *colourspace = (VipsColourspace *) object;
  468|       |
  469|  3.12k|	int i, j;
  470|  3.12k|	VipsImage *x;
  471|  3.12k|	VipsImage **t = (VipsImage **)
  472|  3.12k|		vips_object_local_array(object, 1);
  473|  3.12k|	VipsImage **pipe = (VipsImage **)
  474|  3.12k|		vips_object_local_array(object, MAX_STEPS);
  ------------------
  |  |  191|  3.12k|#define MAX_STEPS (10)
  ------------------
  475|       |
  476|  3.12k|	VipsInterpretation interpretation;
  477|       |
  478|       |	/* Verify that all input args have been set.
  479|       |	 */
  480|  3.12k|	if (VIPS_OBJECT_CLASS(vips_colourspace_parent_class)->build(object))
  ------------------
  |  |  435|  3.12k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  3.12k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  3.12k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (480:6): [True: 0, False: 3.12k]
  ------------------
  481|      0|		return -1;
  482|       |
  483|  3.12k|	x = colourspace->in;
  484|       |
  485|       |	/* Unpack radiance-coded images. We can't use interpretation for this,
  486|       |	 * since rad images can be scRGB or XYZ.
  487|       |	 */
  488|  3.12k|	if (x->Coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (488:6): [True: 0, False: 3.12k]
  ------------------
  489|      0|		if (vips_rad2float(x, &t[0], NULL))
  ------------------
  |  Branch (489:7): [True: 0, False: 0]
  ------------------
  490|      0|			return -1;
  491|      0|		x = t[0];
  492|      0|	}
  493|       |
  494|  3.12k|	if (vips_object_argument_isset(object, "source_space"))
  ------------------
  |  Branch (494:6): [True: 0, False: 3.12k]
  ------------------
  495|      0|		interpretation = colourspace->source_space;
  496|  3.12k|	else
  497|  3.12k|		interpretation = vips_image_guess_interpretation(x);
  498|       |
  499|       |	/* Treat RGB as sRGB. If you want some other treatment,
  500|       |	 * you'll need to use the icc funcs.
  501|       |	 */
  502|  3.12k|	if (interpretation == VIPS_INTERPRETATION_RGB)
  ------------------
  |  Branch (502:6): [True: 0, False: 3.12k]
  ------------------
  503|      0|		interpretation = VIPS_INTERPRETATION_sRGB;
  504|       |
  505|       |	/* No conversion necessary.
  506|       |	 */
  507|  3.12k|	if (interpretation == colourspace->space) {
  ------------------
  |  Branch (507:6): [True: 184, False: 2.94k]
  ------------------
  508|    184|		g_object_set(colourspace, "out", vips_image_new(), NULL);
  509|       |
  510|    184|		return vips_image_write(colourspace->in, colourspace->out);
  511|    184|	}
  512|       |
  513|   361k|	for (i = 0; i < VIPS_NUMBER(vips_colour_routes); i++)
  ------------------
  |  |   60|   361k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (513:14): [True: 361k, False: 2]
  ------------------
  514|   361k|		if (vips_colour_routes[i].from == interpretation &&
  ------------------
  |  Branch (514:7): [True: 23.3k, False: 338k]
  ------------------
  515|   361k|			vips_colour_routes[i].to == colourspace->space)
  ------------------
  |  Branch (515:4): [True: 2.93k, False: 20.4k]
  ------------------
  516|  2.93k|			break;
  517|  2.94k|	if (i == VIPS_NUMBER(vips_colour_routes)) {
  ------------------
  |  |   60|  2.94k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (517:6): [True: 2, False: 2.93k]
  ------------------
  518|      2|		vips_error("vips_colourspace",
  519|      2|			_("no known route from '%s' to '%s'"),
  ------------------
  |  |   30|      2|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      2|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  520|      2|			vips_enum_nick(VIPS_TYPE_INTERPRETATION,
  ------------------
  |  |  142|      2|#define VIPS_TYPE_INTERPRETATION (vips_interpretation_get_type())
  ------------------
  521|      2|				interpretation),
  522|      2|			vips_enum_nick(VIPS_TYPE_INTERPRETATION,
  ------------------
  |  |  142|      2|#define VIPS_TYPE_INTERPRETATION (vips_interpretation_get_type())
  ------------------
  523|      2|				colourspace->space));
  524|      2|		return -1;
  525|      2|	}
  526|       |
  527|  6.87k|	for (j = 0; vips_colour_routes[i].route[j]; j++) {
  ------------------
  |  Branch (527:14): [True: 3.93k, False: 2.93k]
  ------------------
  528|  3.93k|		if (vips_colour_routes[i].route[j](x, &pipe[j], NULL))
  ------------------
  |  Branch (528:7): [True: 0, False: 3.93k]
  ------------------
  529|      0|			return -1;
  530|  3.93k|		x = pipe[j];
  531|  3.93k|	}
  532|       |
  533|  2.93k|	g_object_set(colourspace, "out", vips_image_new(), NULL);
  534|  2.93k|	if (vips_image_write(x, colourspace->out))
  ------------------
  |  Branch (534:6): [True: 0, False: 2.93k]
  ------------------
  535|      0|		return -1;
  536|       |
  537|  2.93k|	return 0;
  538|  2.93k|}
colourspace.c:vips_colourspace_init:
  585|  3.12k|{
  586|  3.12k|	colourspace->source_space = VIPS_INTERPRETATION_sRGB;
  587|  3.12k|}

dE00.c:vips_dE00_class_init:
  231|      1|{
  232|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  233|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  234|       |
  235|      1|	object_class->nickname = "dE00";
  236|      1|	object_class->description = _("calculate dE00");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  237|       |
  238|      1|	colour_class->process_line = vips_dE00_line;
  239|      1|}

dE76.c:vips_dE76_class_init:
  108|      1|{
  109|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  110|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  111|       |
  112|      1|	object_class->nickname = "dE76";
  113|      1|	object_class->description = _("calculate dE76");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  114|       |
  115|      1|	colour_class->process_line = vips__pythagoras_line;
  116|      1|}

dECMC.c:vips_dECMC_class_init:
   56|      1|{
   57|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
   58|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
   59|       |
   60|      1|	object_class->nickname = "dECMC";
   61|      1|	object_class->description = _("calculate dECMC");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   62|       |
   63|      1|	colour_class->process_line = vips__pythagoras_line;
   64|      1|}

float2rad.c:vips_float2rad_class_init:
  200|      1|{
  201|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  202|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  203|       |
  204|      1|	object_class->nickname = "float2rad";
  205|      1|	object_class->description =
  206|      1|		_("transform float RGB to Radiance coding");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  207|       |
  208|      1|	colour_class->process_line = vips_float2rad_line;
  209|      1|}

vips_icc_is_compatible_profile:
 1353|     48|{
 1354|     48|	cmsHPROFILE profile;
 1355|     48|	VipsIccInfo *info;
 1356|       |
 1357|     48|	if (!(profile = cmsOpenProfileFromMem(data, data_length)))
  ------------------
  |  Branch (1357:6): [True: 26, False: 22]
  ------------------
 1358|       |		/* Corrupt profile.
 1359|       |		 */
 1360|     26|		return FALSE;
  ------------------
  |  |  794|     26|#define	FALSE	(0)
  ------------------
 1361|       |
 1362|       |#ifdef DEBUG
 1363|       |	vips_icc_print_profile("from memory", profile);
 1364|       |#endif /*DEBUG*/
 1365|       |
 1366|     22|	if (!(info = vips_icc_info(cmsGetColorSpace(profile)))) {
  ------------------
  |  Branch (1366:6): [True: 3, False: 19]
  ------------------
 1367|       |		/* Unsupported profile.
 1368|       |		 */
 1369|      3|		VIPS_FREEF(cmsCloseProfile, profile);
  ------------------
  |  |   41|      3|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      3|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      3|	{ \
  |  |   43|      3|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 3, False: 0]
  |  |  ------------------
  |  |   44|      3|			(void) F((S)); \
  |  |   45|      3|			(S) = 0; \
  |  |   46|      3|		} \
  |  |   47|      3|	} \
  |  |   48|      3|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      3|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1370|      3|		return FALSE;
  ------------------
  |  |  794|      3|#define	FALSE	(0)
  ------------------
 1371|      3|	}
 1372|       |
 1373|     19|	if (!vips_image_is_profile_compatible(image, info->bands)) {
  ------------------
  |  Branch (1373:6): [True: 10, False: 9]
  ------------------
 1374|       |		/* Bands mismatch.
 1375|       |		 */
 1376|     10|		VIPS_FREEF(cmsCloseProfile, profile);
  ------------------
  |  |   41|     10|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     10|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|     10|	{ \
  |  |   43|     10|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 10, False: 0]
  |  |  ------------------
  |  |   44|     10|			(void) F((S)); \
  |  |   45|     10|			(S) = 0; \
  |  |   46|     10|		} \
  |  |   47|     10|	} \
  |  |   48|     10|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     10|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1377|     10|		return FALSE;
  ------------------
  |  |  794|     10|#define	FALSE	(0)
  ------------------
 1378|     10|	}
 1379|       |
 1380|     19|	VIPS_FREEF(cmsCloseProfile, profile);
  ------------------
  |  |   41|      9|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      9|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      9|	{ \
  |  |   43|      9|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 9, False: 0]
  |  |  ------------------
  |  |   44|      9|			(void) F((S)); \
  |  |   45|      9|			(S) = 0; \
  |  |   46|      9|		} \
  |  |   47|      9|	} \
  |  |   48|     19|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     19|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1381|       |
 1382|      9|	return TRUE;
  ------------------
  |  |  798|      9|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      9|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1383|     19|}
vips_icc_import:
 1451|    528|{
 1452|    528|	va_list ap;
 1453|    528|	int result;
 1454|       |
 1455|    528|	va_start(ap, out);
 1456|    528|	result = vips_call_split("icc_import", ap, in, out);
 1457|    528|	va_end(ap);
 1458|       |
 1459|    528|	return result;
 1460|    528|}
icc_transform.c:vips_icc_class_init:
  749|      1|{
  750|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  751|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  752|       |
  753|      1|	gobject_class->dispose = vips_icc_dispose;
  754|      1|	gobject_class->set_property = vips_object_set_property;
  755|      1|	gobject_class->get_property = vips_object_get_property;
  756|       |
  757|      1|	object_class->nickname = "icc";
  758|      1|	object_class->description = _("transform using ICC profiles");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  759|      1|	object_class->build = vips_icc_build;
  760|       |
  761|      1|	VIPS_ARG_ENUM(class, "intent", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  762|      1|		_("Intent"),
  763|      1|		_("Rendering intent"),
  764|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  765|      1|		G_STRUCT_OFFSET(VipsIcc, intent),
  766|      1|		VIPS_TYPE_INTENT, VIPS_INTENT_RELATIVE);
  767|       |
  768|      1|	VIPS_ARG_ENUM(class, "pcs", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  769|      1|		_("PCS"),
  770|      1|		_("Set Profile Connection Space"),
  771|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  772|      1|		G_STRUCT_OFFSET(VipsIcc, pcs),
  773|      1|		VIPS_TYPE_PCS, VIPS_PCS_LAB);
  774|       |
  775|      1|	VIPS_ARG_BOOL(class, "black_point_compensation", 7,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  776|      1|		_("Black point compensation"),
  777|      1|		_("Enable black point compensation"),
  778|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  779|      1|		G_STRUCT_OFFSET(VipsIcc, black_point_compensation),
  780|      1|		FALSE);
  781|       |
  782|      1|	cmsSetLogErrorHandler(icc_error);
  783|      1|}
icc_transform.c:vips_icc_dispose:
  187|    528|{
  188|    528|	VipsIcc *icc = (VipsIcc *) gobject;
  189|       |
  190|    528|	VIPS_FREEF(cmsDeleteTransform, icc->trans);
  ------------------
  |  |   41|    528|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    528|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|    528|	{ \
  |  |   43|    528|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 528, False: 0]
  |  |  ------------------
  |  |   44|    528|			(void) F((S)); \
  |  |   45|    528|			(S) = 0; \
  |  |   46|    528|		} \
  |  |   47|    528|	} \
  |  |   48|    528|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    528|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  191|    528|	VIPS_FREEF(cmsCloseProfile, icc->in_profile);
  ------------------
  |  |   41|    528|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    528|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|    528|	{ \
  |  |   43|    528|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 528, False: 0]
  |  |  ------------------
  |  |   44|    528|			(void) F((S)); \
  |  |   45|    528|			(S) = 0; \
  |  |   46|    528|		} \
  |  |   47|    528|	} \
  |  |   48|    528|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    528|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|    528|	VIPS_FREEF(cmsCloseProfile, icc->out_profile);
  ------------------
  |  |   41|    528|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    528|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|    528|	{ \
  |  |   43|    528|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 528, False: 0]
  |  |  ------------------
  |  |   44|    528|			(void) F((S)); \
  |  |   45|    528|			(S) = 0; \
  |  |   46|    528|		} \
  |  |   47|    528|	} \
  |  |   48|    528|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    528|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|       |
  194|    528|	if (icc->in_blob) {
  ------------------
  |  Branch (194:6): [True: 528, False: 0]
  ------------------
  195|    528|		vips_area_unref((VipsArea *) icc->in_blob);
  196|    528|		icc->in_blob = NULL;
  197|    528|	}
  198|       |
  199|    528|	if (icc->out_blob) {
  ------------------
  |  Branch (199:6): [True: 0, False: 528]
  ------------------
  200|      0|		vips_area_unref((VipsArea *) icc->out_blob);
  201|      0|		icc->out_blob = NULL;
  202|      0|	}
  203|       |
  204|    528|	G_OBJECT_CLASS(vips_icc_parent_class)->dispose(gobject);
  ------------------
  |  |   58|    528|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|    528|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    528|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|    528|}
icc_transform.c:vips_icc_build:
  258|    528|{
  259|    528|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    528|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    528|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    528|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  260|    528|	VipsColour *colour = (VipsColour *) object;
  261|    528|	VipsColourCode *code = (VipsColourCode *) object;
  262|    528|	VipsIcc *icc = (VipsIcc *) object;
  263|       |
  264|    528|	cmsUInt32Number flags;
  265|       |
  266|    528|	if (icc->depth != 8 &&
  ------------------
  |  Branch (266:6): [True: 0, False: 528]
  ------------------
  267|    528|		icc->depth != 16) {
  ------------------
  |  Branch (267:3): [True: 0, False: 0]
  ------------------
  268|      0|		vips_error(class->nickname,
  269|      0|			"%s", _("depth must be 8 or 16"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  270|      0|		return -1;
  271|      0|	}
  272|       |
  273|    528|	if (icc->in_profile &&
  ------------------
  |  Branch (273:6): [True: 528, False: 0]
  ------------------
  274|    528|		code->in) {
  ------------------
  |  Branch (274:3): [True: 528, False: 0]
  ------------------
  275|    528|		int signature;
  276|    528|		VipsIccInfo *info;
  277|       |
  278|    528|		signature = cmsGetColorSpace(icc->in_profile);
  279|    528|		if (!(info = vips_icc_info(signature))) {
  ------------------
  |  Branch (279:7): [True: 0, False: 528]
  ------------------
  280|      0|			vips_error(class->nickname,
  281|      0|				_("unimplemented input color space 0x%x"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  282|      0|				signature);
  283|      0|			return -1;
  284|      0|		}
  285|       |
  286|    528|		colour->input_bands = info->bands;
  287|       |
  288|    528|		switch (signature) {
  289|      0|		case cmsSigGrayData:
  ------------------
  |  Branch (289:3): [True: 0, False: 528]
  ------------------
  290|      0|			code->input_format = code->in->BandFmt == VIPS_FORMAT_USHORT
  ------------------
  |  Branch (290:25): [True: 0, False: 0]
  ------------------
  291|      0|				? VIPS_FORMAT_USHORT
  292|      0|				: VIPS_FORMAT_UCHAR;
  293|      0|			icc->in_icc_format = code->in->BandFmt == VIPS_FORMAT_USHORT
  ------------------
  |  Branch (293:25): [True: 0, False: 0]
  ------------------
  294|      0|				? info->lcms_type16
  295|      0|				: info->lcms_type8;
  296|      0|			break;
  297|       |
  298|      0|		case cmsSigRgbData:
  ------------------
  |  Branch (298:3): [True: 0, False: 528]
  ------------------
  299|      0|			code->input_format = code->in->BandFmt == VIPS_FORMAT_USHORT
  ------------------
  |  Branch (299:25): [True: 0, False: 0]
  ------------------
  300|      0|				? VIPS_FORMAT_USHORT
  301|      0|				: VIPS_FORMAT_UCHAR;
  302|      0|			icc->in_icc_format = code->in->BandFmt == VIPS_FORMAT_USHORT
  ------------------
  |  Branch (302:25): [True: 0, False: 0]
  ------------------
  303|      0|				? info->lcms_type16
  304|      0|				: info->lcms_type8;
  305|      0|			break;
  306|       |
  307|      0|		case cmsSigLabData:
  ------------------
  |  Branch (307:3): [True: 0, False: 528]
  ------------------
  308|      0|			code->input_format = VIPS_FORMAT_FLOAT;
  309|      0|			code->input_interpretation =
  310|      0|				VIPS_INTERPRETATION_LAB;
  311|      0|			icc->in_icc_format = info->lcms_type8;
  312|      0|			break;
  313|       |
  314|      0|		case cmsSigXYZData:
  ------------------
  |  Branch (314:3): [True: 0, False: 528]
  ------------------
  315|      0|			code->input_format = VIPS_FORMAT_FLOAT;
  316|      0|			code->input_interpretation =
  317|      0|				VIPS_INTERPRETATION_XYZ;
  318|      0|			icc->in_icc_format = info->lcms_type8;
  319|      0|			break;
  320|       |
  321|    528|		case cmsSigCmykData:
  ------------------
  |  Branch (321:3): [True: 528, False: 0]
  ------------------
  322|    528|		case cmsSig5colorData:
  ------------------
  |  Branch (322:3): [True: 0, False: 528]
  ------------------
  323|    528|		case cmsSig6colorData:
  ------------------
  |  Branch (323:3): [True: 0, False: 528]
  ------------------
  324|    528|		case cmsSig7colorData:
  ------------------
  |  Branch (324:3): [True: 0, False: 528]
  ------------------
  325|    528|		case cmsSig8colorData:
  ------------------
  |  Branch (325:3): [True: 0, False: 528]
  ------------------
  326|    528|		case cmsSig9colorData:
  ------------------
  |  Branch (326:3): [True: 0, False: 528]
  ------------------
  327|    528|		case cmsSig10colorData:
  ------------------
  |  Branch (327:3): [True: 0, False: 528]
  ------------------
  328|    528|		case cmsSig11colorData:
  ------------------
  |  Branch (328:3): [True: 0, False: 528]
  ------------------
  329|    528|		case cmsSig12colorData:
  ------------------
  |  Branch (329:3): [True: 0, False: 528]
  ------------------
  330|       |			/* Treat as forms of CMYK.
  331|       |			 */
  332|    528|			info = vips_icc_info(
  333|    528|				cmsGetColorSpace(icc->in_profile));
  334|       |
  335|    528|			code->input_format = code->in->BandFmt == VIPS_FORMAT_USHORT
  ------------------
  |  Branch (335:25): [True: 2, False: 526]
  ------------------
  336|    528|				? VIPS_FORMAT_USHORT
  337|    528|				: VIPS_FORMAT_UCHAR;
  338|    528|			icc->in_icc_format =
  339|    528|				code->in->BandFmt == VIPS_FORMAT_USHORT
  ------------------
  |  Branch (339:5): [True: 2, False: 526]
  ------------------
  340|    528|				? info->lcms_type16
  341|    528|				: info->lcms_type8;
  342|    528|			break;
  343|       |
  344|      0|		default:
  ------------------
  |  Branch (344:3): [True: 0, False: 528]
  ------------------
  345|      0|			g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  346|      0|			return -1;
  347|    528|		}
  348|    528|	}
  349|       |
  350|    528|	if (icc->out_profile) {
  ------------------
  |  Branch (350:6): [True: 528, False: 0]
  ------------------
  351|    528|		int signature;
  352|    528|		VipsIccInfo *info;
  353|       |
  354|    528|		signature = cmsGetColorSpace(icc->out_profile);
  355|    528|		if (!(info = vips_icc_info(signature))) {
  ------------------
  |  Branch (355:7): [True: 0, False: 528]
  ------------------
  356|      0|			vips_error(class->nickname,
  357|      0|				_("unimplemented output color space 0x%x"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  358|      0|				signature);
  359|      0|			return -1;
  360|      0|		}
  361|       |
  362|    528|		colour->bands = info->bands;
  363|       |
  364|    528|		switch (signature) {
  365|      0|		case cmsSigGrayData:
  ------------------
  |  Branch (365:3): [True: 0, False: 528]
  ------------------
  366|      0|			colour->interpretation = icc->depth == 8
  ------------------
  |  Branch (366:29): [True: 0, False: 0]
  ------------------
  367|      0|				? VIPS_INTERPRETATION_B_W
  368|      0|				: VIPS_INTERPRETATION_GREY16;
  369|      0|			colour->format = icc->depth == 8
  ------------------
  |  Branch (369:21): [True: 0, False: 0]
  ------------------
  370|      0|				? VIPS_FORMAT_UCHAR
  371|      0|				: VIPS_FORMAT_USHORT;
  372|      0|			icc->out_icc_format = icc->depth == 16
  ------------------
  |  Branch (372:26): [True: 0, False: 0]
  ------------------
  373|      0|				? info->lcms_type16
  374|      0|				: info->lcms_type8;
  375|      0|			break;
  376|       |
  377|      0|		case cmsSigRgbData:
  ------------------
  |  Branch (377:3): [True: 0, False: 528]
  ------------------
  378|      0|			colour->interpretation = icc->depth == 8
  ------------------
  |  Branch (378:29): [True: 0, False: 0]
  ------------------
  379|      0|				? VIPS_INTERPRETATION_sRGB
  380|      0|				: VIPS_INTERPRETATION_RGB16;
  381|      0|			colour->format = icc->depth == 8
  ------------------
  |  Branch (381:21): [True: 0, False: 0]
  ------------------
  382|      0|				? VIPS_FORMAT_UCHAR
  383|      0|				: VIPS_FORMAT_USHORT;
  384|      0|			icc->out_icc_format = icc->depth == 16
  ------------------
  |  Branch (384:26): [True: 0, False: 0]
  ------------------
  385|      0|				? info->lcms_type16
  386|      0|				: info->lcms_type8;
  387|      0|			break;
  388|       |
  389|      0|		case cmsSigLabData:
  ------------------
  |  Branch (389:3): [True: 0, False: 528]
  ------------------
  390|      0|			colour->interpretation = VIPS_INTERPRETATION_LAB;
  391|      0|			colour->format = VIPS_FORMAT_FLOAT;
  392|      0|			icc->out_icc_format = info->lcms_type16;
  393|      0|			break;
  394|       |
  395|    528|		case cmsSigXYZData:
  ------------------
  |  Branch (395:3): [True: 528, False: 0]
  ------------------
  396|    528|			colour->interpretation = VIPS_INTERPRETATION_XYZ;
  397|    528|			colour->format = VIPS_FORMAT_FLOAT;
  398|    528|			icc->out_icc_format = info->lcms_type16;
  399|    528|			break;
  400|       |
  401|      0|		case cmsSigCmykData:
  ------------------
  |  Branch (401:3): [True: 0, False: 528]
  ------------------
  402|      0|		case cmsSig5colorData:
  ------------------
  |  Branch (402:3): [True: 0, False: 528]
  ------------------
  403|      0|		case cmsSig6colorData:
  ------------------
  |  Branch (403:3): [True: 0, False: 528]
  ------------------
  404|      0|		case cmsSig7colorData:
  ------------------
  |  Branch (404:3): [True: 0, False: 528]
  ------------------
  405|      0|		case cmsSig8colorData:
  ------------------
  |  Branch (405:3): [True: 0, False: 528]
  ------------------
  406|      0|		case cmsSig9colorData:
  ------------------
  |  Branch (406:3): [True: 0, False: 528]
  ------------------
  407|      0|		case cmsSig10colorData:
  ------------------
  |  Branch (407:3): [True: 0, False: 528]
  ------------------
  408|      0|		case cmsSig11colorData:
  ------------------
  |  Branch (408:3): [True: 0, False: 528]
  ------------------
  409|      0|		case cmsSig12colorData:
  ------------------
  |  Branch (409:3): [True: 0, False: 528]
  ------------------
  410|       |			/* Treat as forms of CMYK.
  411|       |			 */
  412|      0|			colour->interpretation = VIPS_INTERPRETATION_CMYK;
  413|      0|			colour->format = icc->depth == 8
  ------------------
  |  Branch (413:21): [True: 0, False: 0]
  ------------------
  414|      0|				? VIPS_FORMAT_UCHAR
  415|      0|				: VIPS_FORMAT_USHORT;
  416|      0|			icc->out_icc_format = icc->depth == 16
  ------------------
  |  Branch (416:26): [True: 0, False: 0]
  ------------------
  417|      0|				? info->lcms_type16
  418|      0|				: info->lcms_type8;
  419|      0|			break;
  420|       |
  421|      0|		default:
  ------------------
  |  Branch (421:3): [True: 0, False: 528]
  ------------------
  422|      0|			g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  423|      0|			return -1;
  424|    528|		}
  425|    528|	}
  426|       |
  427|       |	/* At least one must be a device profile.
  428|       |	 */
  429|    528|	if (icc->in_profile &&
  ------------------
  |  Branch (429:6): [True: 528, False: 0]
  ------------------
  430|    528|		icc->out_profile &&
  ------------------
  |  Branch (430:3): [True: 528, False: 0]
  ------------------
  431|    528|		is_pcs(icc->in_profile) &&
  ------------------
  |  Branch (431:3): [True: 0, False: 528]
  ------------------
  432|    528|		is_pcs(icc->out_profile)) {
  ------------------
  |  Branch (432:3): [True: 0, False: 0]
  ------------------
  433|      0|		vips_error(class->nickname,
  434|      0|			"%s", _("no device profile"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  435|      0|		return -1;
  436|      0|	}
  437|       |
  438|       |	/* Use cmsFLAGS_NOCACHE to disable the 1-pixel cache and make
  439|       |	 * calling cmsDoTransform() from multiple threads safe.
  440|       |	 */
  441|    528|	flags = cmsFLAGS_NOCACHE;
  ------------------
  |  | 1722|    528|#define cmsFLAGS_NOCACHE                  0x0040    // Inhibit 1-pixel cache
  ------------------
  442|       |
  443|    528|	if (icc->black_point_compensation)
  ------------------
  |  Branch (443:6): [True: 0, False: 528]
  ------------------
  444|      0|		flags |= cmsFLAGS_BLACKPOINTCOMPENSATION;
  ------------------
  |  | 1731|      0|#define cmsFLAGS_BLACKPOINTCOMPENSATION   0x2000
  ------------------
  445|       |
  446|    528|	if (!(icc->trans = cmsCreateTransform(
  ------------------
  |  Branch (446:6): [True: 0, False: 528]
  ------------------
  447|    528|			  icc->in_profile, icc->in_icc_format,
  448|    528|			  icc->out_profile, icc->out_icc_format,
  449|    528|			  icc->intent, flags)))
  450|      0|		return -1;
  451|       |
  452|    528|	if (VIPS_OBJECT_CLASS(vips_icc_parent_class)->build(object))
  ------------------
  |  |  435|    528|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    528|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    528|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (452:6): [True: 0, False: 528]
  ------------------
  453|      0|		return -1;
  454|       |
  455|    528|	return 0;
  456|    528|}
icc_transform.c:is_pcs:
  211|    528|{
  212|    528|	return cmsGetColorSpace(profile) == cmsSigLabData ||
  ------------------
  |  Branch (212:9): [True: 0, False: 528]
  ------------------
  213|    528|		cmsGetColorSpace(profile) == cmsSigXYZData;
  ------------------
  |  Branch (213:3): [True: 0, False: 528]
  ------------------
  214|    528|}
icc_transform.c:icc_error:
  181|     26|{
  182|     26|	vips_error("VipsIcc", "%s", text);
  183|     26|}
icc_transform.c:vips_icc_init:
  787|    528|{
  788|    528|	icc->intent = VIPS_INTENT_RELATIVE;
  789|    528|	icc->pcs = VIPS_PCS_LAB;
  790|    528|	icc->depth = 8;
  791|    528|}
icc_transform.c:vips_icc_import_class_init:
  943|      1|{
  944|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  945|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  946|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  947|       |
  948|      1|	gobject_class->set_property = vips_object_set_property;
  949|      1|	gobject_class->get_property = vips_object_get_property;
  950|       |
  951|      1|	object_class->nickname = "icc_import";
  952|      1|	object_class->description = _("import from device with ICC profile");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  953|      1|	object_class->build = vips_icc_import_build;
  954|       |
  955|      1|	colour_class->process_line = vips_icc_import_line;
  956|       |
  957|      1|	VIPS_ARG_BOOL(class, "embedded", 110,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  958|      1|		_("Embedded"),
  959|      1|		_("Use embedded input profile, if available"),
  960|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  961|      1|		G_STRUCT_OFFSET(VipsIccImport, embedded),
  962|      1|		FALSE);
  963|       |
  964|      1|	VIPS_ARG_STRING(class, "input_profile", 120,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  965|      1|		_("Input profile"),
  966|      1|		_("Filename to load input profile from"),
  967|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  968|      1|		G_STRUCT_OFFSET(VipsIccImport, input_profile_filename),
  969|      1|		NULL);
  970|      1|}
icc_transform.c:vips_icc_import_build:
  807|    528|{
  808|    528|	VipsColour *colour = (VipsColour *) object;
  809|    528|	VipsIcc *icc = (VipsIcc *) object;
  810|    528|	VipsIccImport *import = (VipsIccImport *) object;
  811|       |
  812|    528|	if (vips_icc_set_import(icc,
  ------------------
  |  Branch (812:6): [True: 0, False: 528]
  ------------------
  813|    528|			import->embedded, import->input_profile_filename))
  814|      0|		return -1;
  815|       |
  816|    528|	if (icc->pcs == VIPS_PCS_LAB) {
  ------------------
  |  Branch (816:6): [True: 0, False: 528]
  ------------------
  817|      0|		cmsCIExyY white;
  818|      0|		cmsWhitePointFromTemp(&white, 6504);
  819|       |
  820|      0|		icc->out_profile = cmsCreateLab4Profile(&white);
  821|      0|	}
  822|    528|	else
  823|    528|		icc->out_profile = cmsCreateXYZProfile();
  824|       |
  825|    528|	if (VIPS_OBJECT_CLASS(vips_icc_import_parent_class)->build(object))
  ------------------
  |  |  435|    528|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    528|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    528|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (825:6): [True: 0, False: 528]
  ------------------
  826|      0|		return -1;
  827|       |
  828|       |	/* If we used the fallback profile, we need to attach it to the PCS
  829|       |	 * image, since the PCS image needs a route back to device space.
  830|       |	 *
  831|       |	 * In the same way, we don't remove the embedded input profile on
  832|       |	 * import.
  833|       |	 */
  834|    528|	if (icc->non_standard_input_profile &&
  ------------------
  |  Branch (834:6): [True: 528, False: 0]
  ------------------
  835|    528|		icc->in_blob) {
  ------------------
  |  Branch (835:3): [True: 528, False: 0]
  ------------------
  836|    528|		const void *data;
  837|    528|		size_t size;
  838|       |
  839|    528|		data = vips_blob_get(icc->in_blob, &size);
  840|    528|		vips_image_set_blob(colour->out, VIPS_META_ICC_NAME,
  ------------------
  |  |   78|    528|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  841|    528|			NULL, data, size);
  842|    528|	}
  843|       |
  844|    528|	return 0;
  845|    528|}
icc_transform.c:vips_icc_set_import:
  688|    528|{
  689|    528|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(icc);
  ------------------
  |  |  441|    528|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    528|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    528|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  690|    528|	VipsColourCode *code = (VipsColourCode *) icc;
  691|       |
  692|    528|	icc->non_standard_input_profile = FALSE;
  ------------------
  |  |  794|    528|#define	FALSE	(0)
  ------------------
  693|       |
  694|       |	/* Try embedded profile.
  695|       |	 */
  696|    528|	if (code->in &&
  ------------------
  |  Branch (696:6): [True: 528, False: 0]
  ------------------
  697|    528|		(embedded || !input_profile_filename)) {
  ------------------
  |  Branch (697:4): [True: 528, False: 0]
  |  Branch (697:16): [True: 0, False: 0]
  ------------------
  698|    528|		icc->in_blob = vips_icc_get_profile_image(code->in);
  699|    528|		icc->in_profile = vips_icc_verify_blob(icc, &icc->in_blob);
  700|    528|	}
  701|       |
  702|       |	/* Try profile from filename.
  703|       |	 */
  704|    528|	if (code->in &&
  ------------------
  |  Branch (704:6): [True: 528, False: 0]
  ------------------
  705|    528|		!icc->in_blob &&
  ------------------
  |  Branch (705:3): [True: 528, False: 0]
  ------------------
  706|    528|		input_profile_filename) {
  ------------------
  |  Branch (706:3): [True: 528, False: 0]
  ------------------
  707|    528|		if (!vips_profile_load(input_profile_filename, &icc->in_blob, NULL) &&
  ------------------
  |  Branch (707:7): [True: 528, False: 0]
  ------------------
  708|    528|			(icc->in_profile = vips_icc_verify_blob(icc, &icc->in_blob)))
  ------------------
  |  Branch (708:4): [True: 528, False: 0]
  ------------------
  709|    528|			icc->non_standard_input_profile = TRUE;
  ------------------
  |  |  798|    528|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    528|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  710|    528|	}
  711|       |
  712|       |	/* Try a built-in profile.
  713|       |	 */
  714|    528|	if (code->in &&
  ------------------
  |  Branch (714:6): [True: 528, False: 0]
  ------------------
  715|    528|		!icc->in_profile) {
  ------------------
  |  Branch (715:3): [True: 0, False: 528]
  ------------------
  716|      0|		const char *name;
  717|       |
  718|      0|		switch (code->in->Type) {
  719|      0|		case VIPS_INTERPRETATION_B_W:
  ------------------
  |  Branch (719:3): [True: 0, False: 0]
  ------------------
  720|      0|		case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (720:3): [True: 0, False: 0]
  ------------------
  721|      0|			name = "sgrey";
  722|      0|			break;
  723|       |
  724|      0|		case VIPS_INTERPRETATION_CMYK:
  ------------------
  |  Branch (724:3): [True: 0, False: 0]
  ------------------
  725|      0|			name = "cmyk";
  726|      0|			break;
  727|       |
  728|      0|		default:
  ------------------
  |  Branch (728:3): [True: 0, False: 0]
  ------------------
  729|      0|			name = "srgb";
  730|      0|			break;
  731|      0|		}
  732|       |
  733|      0|		if (!vips_profile_load(name, &icc->in_blob, NULL) &&
  ------------------
  |  Branch (733:7): [True: 0, False: 0]
  ------------------
  734|      0|			(icc->in_profile = vips_icc_verify_blob(icc, &icc->in_blob)))
  ------------------
  |  Branch (734:4): [True: 0, False: 0]
  ------------------
  735|      0|			icc->non_standard_input_profile = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  736|      0|	}
  737|       |
  738|    528|	if (!icc->in_profile) {
  ------------------
  |  Branch (738:6): [True: 0, False: 528]
  ------------------
  739|      0|		vips_error(class->nickname, "%s",
  740|      0|			_("unable to load or find any compatible input profile"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  741|      0|		return -1;
  742|      0|	}
  743|       |
  744|    528|	return 0;
  745|    528|}
icc_transform.c:vips_icc_get_profile_image:
  462|    528|{
  463|    528|	const void *data;
  464|    528|	size_t size;
  465|       |
  466|    528|	if (!vips_image_get_typeof(image, VIPS_META_ICC_NAME))
  ------------------
  |  |   78|    528|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  |  Branch (466:6): [True: 528, False: 0]
  ------------------
  467|    528|		return NULL;
  468|      0|	if (vips_image_get_blob(image, VIPS_META_ICC_NAME, &data, &size))
  ------------------
  |  |   78|      0|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  |  Branch (468:6): [True: 0, False: 0]
  ------------------
  469|      0|		return NULL;
  470|       |
  471|      0|	return vips_blob_new(NULL, data, size);
  472|      0|}
icc_transform.c:vips_icc_verify_blob:
  654|  1.05k|{
  655|  1.05k|	if (*blob) {
  ------------------
  |  Branch (655:6): [True: 528, False: 528]
  ------------------
  656|    528|		VipsColourCode *code = (VipsColourCode *) icc;
  657|    528|		cmsHPROFILE profile = vips_icc_load_profile_blob(*blob,
  658|    528|			code->in, icc->intent, LCMS_USED_AS_INPUT);
  ------------------
  |  | 1555|    528|#define LCMS_USED_AS_INPUT      0
  ------------------
  659|       |
  660|    528|		if (!profile) {
  ------------------
  |  Branch (660:7): [True: 0, False: 528]
  ------------------
  661|      0|			vips_area_unref((VipsArea *) *blob);
  662|      0|			*blob = NULL;
  663|      0|		}
  664|       |
  665|    528|		return profile;
  666|    528|	}
  667|       |
  668|    528|	return NULL;
  669|  1.05k|}
icc_transform.c:vips_icc_load_profile_blob:
  601|    528|{
  602|    528|	const void *data;
  603|    528|	size_t size;
  604|    528|	cmsHPROFILE profile;
  605|    528|	VipsIccInfo *info;
  606|       |
  607|       |#ifdef DEBUG
  608|       |	printf("loading %s profile, intent %s, from blob %p\n",
  609|       |		direction == LCMS_USED_AS_INPUT ? _("input") : _("output"),
  610|       |		vips_enum_nick(VIPS_TYPE_INTENT, intent),
  611|       |		blob);
  612|       |#endif /*DEBUG*/
  613|       |
  614|    528|	data = vips_blob_get(blob, &size);
  615|    528|	if (!(profile = cmsOpenProfileFromMem(data, size))) {
  ------------------
  |  Branch (615:6): [True: 0, False: 528]
  ------------------
  616|      0|		g_warning("%s", _("corrupt profile"));
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  617|      0|		return NULL;
  618|      0|	}
  619|       |
  620|       |#ifdef DEBUG
  621|       |	vips_icc_print_profile("loaded from blob to make", profile);
  622|       |#endif /*DEBUG*/
  623|       |
  624|    528|	if (!(info = vips_icc_info(cmsGetColorSpace(profile)))) {
  ------------------
  |  Branch (624:6): [True: 0, False: 528]
  ------------------
  625|      0|		VIPS_FREEF(cmsCloseProfile, profile);
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|      0|	} \
  |  |   48|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  626|      0|		g_warning("%s", _("unsupported profile"));
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  627|      0|		return NULL;
  628|      0|	}
  629|       |
  630|    528|	if (image &&
  ------------------
  |  Branch (630:6): [True: 528, False: 0]
  ------------------
  631|    528|		!vips_image_is_profile_compatible(image, info->bands)) {
  ------------------
  |  Branch (631:3): [True: 0, False: 528]
  ------------------
  632|      0|		VIPS_FREEF(cmsCloseProfile, profile);
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|      0|	} \
  |  |   48|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  633|      0|		g_warning("%s", _("profile incompatible with image"));
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  634|      0|		return NULL;
  635|      0|	}
  636|       |
  637|    528|	if (!cmsIsIntentSupported(profile, intent, direction)) {
  ------------------
  |  Branch (637:6): [True: 0, False: 528]
  ------------------
  638|      0|		VIPS_FREEF(cmsCloseProfile, profile);
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|      0|	} \
  |  |   48|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  639|      0|		g_warning(_("profile does not support %s %s intent"),
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (340:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  640|      0|			vips_enum_nick(VIPS_TYPE_INTENT, intent),
  641|      0|			direction == LCMS_USED_AS_INPUT ? _("input") : _("output"));
  642|      0|		return NULL;
  643|      0|	}
  644|       |
  645|    528|	return profile;
  646|    528|}
icc_transform.c:vips_icc_import_line:
  909|  25.1k|{
  910|  25.1k|	VipsIcc *icc = (VipsIcc *) colour;
  911|       |
  912|  25.1k|	VipsPel *p;
  913|  25.1k|	float *q;
  914|  25.1k|	int i;
  915|       |
  916|       |	/* Buffer of encoded 16-bit pixels we transform.
  917|       |	 */
  918|  25.1k|	guint16 encoded[3 * PIXEL_BUFFER_SIZE];
  919|       |
  920|  25.1k|	p = (VipsPel *) in[0];
  921|  25.1k|	q = (float *) out;
  922|  50.3k|	for (i = 0; i < width; i += PIXEL_BUFFER_SIZE) {
  ------------------
  |  |  101|  25.1k|#define PIXEL_BUFFER_SIZE (10000)
  ------------------
  |  Branch (922:14): [True: 25.1k, False: 25.1k]
  ------------------
  923|  25.1k|		const int chunk = VIPS_MIN(width - i, PIXEL_BUFFER_SIZE);
  ------------------
  |  |   55|  25.1k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 25.1k, False: 0]
  |  |  ------------------
  ------------------
  924|       |
  925|  25.1k|		cmsDoTransform(icc->trans, p, encoded, chunk);
  926|       |
  927|  25.1k|		if (icc->pcs == VIPS_PCS_LAB)
  ------------------
  |  Branch (927:7): [True: 0, False: 25.1k]
  ------------------
  928|      0|			decode_lab(encoded, q, chunk);
  929|  25.1k|		else
  930|  25.1k|			decode_xyz(encoded, q, chunk);
  931|       |
  932|       |		// use input_bands, since in[0] may have had alpha removed,
  933|       |		// and can have 1, 3 or 4 bands
  934|  25.1k|		p += PIXEL_BUFFER_SIZE *
  ------------------
  |  |  101|  25.1k|#define PIXEL_BUFFER_SIZE (10000)
  ------------------
  935|  25.1k|			colour->input_bands *
  936|  25.1k|			VIPS_IMAGE_SIZEOF_ELEMENT(colour->in[0]);
  ------------------
  |  |  382|  25.1k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  ------------------
  937|  25.1k|		q += PIXEL_BUFFER_SIZE * 3;
  ------------------
  |  |  101|  25.1k|#define PIXEL_BUFFER_SIZE (10000)
  ------------------
  938|  25.1k|	}
  939|  25.1k|}
icc_transform.c:decode_xyz:
  871|  25.1k|{
  872|  25.1k|	int i;
  873|       |
  874|  2.24M|	for (i = 0; i < n; i++) {
  ------------------
  |  Branch (874:14): [True: 2.21M, False: 25.1k]
  ------------------
  875|       |		/* cmsXYZEncoded2Float inlined.
  876|       |		 */
  877|  2.21M|		float X = fixed[0] / 32768.0;
  878|  2.21M|		float Y = fixed[1] / 32768.0;
  879|  2.21M|		float Z = fixed[2] / 32768.0;
  880|       |
  881|  2.21M|		X *= SCALE;
  ------------------
  |  |  867|  2.21M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  2.21M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  882|  2.21M|		Y *= SCALE;
  ------------------
  |  |  867|  2.21M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  2.21M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  883|  2.21M|		Z *= SCALE;
  ------------------
  |  |  867|  2.21M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  2.21M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  884|       |
  885|       |		/* Transform XYZ D50 to D65, chromatic adaption is done with the
  886|       |		 * Bradford transformation.
  887|       |		 * See: https://fujiwaratko.sakura.ne.jp/infosci/colorspace/bradford_e.html
  888|       |		 */
  889|  2.21M|		xyz[0] = 0.955513 * X +
  890|  2.21M|			-0.023073 * Y +
  891|  2.21M|			0.063309 * Z;
  892|  2.21M|		xyz[1] = -0.028325 * X +
  893|  2.21M|			1.009942 * Y +
  894|  2.21M|			0.021055 * Z;
  895|  2.21M|		xyz[2] = 0.012329 * X +
  896|  2.21M|			-0.020536 * Y +
  897|  2.21M|			1.330714 * Z;
  898|       |
  899|  2.21M|		xyz += 3;
  900|  2.21M|		fixed += 3;
  901|  2.21M|	}
  902|  25.1k|}
icc_transform.c:vips_icc_import_init:
  974|    528|{
  975|    528|}
icc_transform.c:vips_icc_export_class_init:
 1115|      1|{
 1116|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1117|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1118|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
 1119|       |
 1120|      1|	gobject_class->set_property = vips_object_set_property;
 1121|      1|	gobject_class->get_property = vips_object_get_property;
 1122|       |
 1123|      1|	object_class->nickname = "icc_export";
 1124|      1|	object_class->description = _("output to device with ICC profile");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1125|      1|	object_class->build = vips_icc_export_build;
 1126|       |
 1127|      1|	colour_class->process_line = vips_icc_export_line;
 1128|       |
 1129|      1|	VIPS_ARG_STRING(class, "output_profile", 110,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1130|      1|		_("Output profile"),
 1131|      1|		_("Filename to load output profile from"),
 1132|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1133|      1|		G_STRUCT_OFFSET(VipsIccExport, output_profile_filename),
 1134|      1|		NULL);
 1135|       |
 1136|      1|	VIPS_ARG_INT(class, "depth", 130,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1137|      1|		_("Depth"),
 1138|      1|		_("Output device space depth in bits"),
 1139|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1140|      1|		G_STRUCT_OFFSET(VipsIcc, depth),
 1141|      1|		8, 16, 8);
 1142|      1|}
icc_transform.c:vips_icc_transform_class_init:
 1218|      1|{
 1219|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1220|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1221|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
 1222|       |
 1223|      1|	gobject_class->set_property = vips_object_set_property;
 1224|      1|	gobject_class->get_property = vips_object_get_property;
 1225|       |
 1226|      1|	object_class->nickname = "icc_transform";
 1227|      1|	object_class->description =
 1228|      1|		_("transform between devices with ICC profiles");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1229|      1|	object_class->build = vips_icc_transform_build;
 1230|       |
 1231|      1|	colour_class->process_line = vips_icc_transform_line;
 1232|       |
 1233|      1|	VIPS_ARG_STRING(class, "output_profile", 110,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1234|      1|		_("Output profile"),
 1235|      1|		_("Filename to load output profile from"),
 1236|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1237|      1|		G_STRUCT_OFFSET(VipsIccTransform, output_profile_filename),
 1238|      1|		NULL);
 1239|       |
 1240|      1|	VIPS_ARG_BOOL(class, "embedded", 120,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1241|      1|		_("Embedded"),
 1242|      1|		_("Use embedded input profile, if available"),
 1243|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1244|      1|		G_STRUCT_OFFSET(VipsIccTransform, embedded),
 1245|      1|		FALSE);
 1246|       |
 1247|      1|	VIPS_ARG_STRING(class, "input_profile", 130,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1248|      1|		_("Input profile"),
 1249|      1|		_("Filename to load input profile from"),
 1250|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1251|      1|		G_STRUCT_OFFSET(VipsIccTransform, input_profile_filename),
 1252|      1|		NULL);
 1253|       |
 1254|      1|	VIPS_ARG_INT(class, "depth", 140,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1255|      1|		_("Depth"),
 1256|      1|		_("Output device space depth in bits"),
 1257|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1258|      1|		G_STRUCT_OFFSET(VipsIcc, depth),
 1259|      1|		8, 16, 8);
 1260|      1|}
icc_transform.c:vips_icc_info:
  246|  2.13k|{
  247|  2.13k|	int i;
  248|       |
  249|  10.1k|	for (i = 0; i < VIPS_NUMBER(vips_icc_info_table); i++)
  ------------------
  |  |   60|  10.1k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (249:14): [True: 10.1k, False: 3]
  ------------------
  250|  10.1k|		if (vips_icc_info_table[i].signature == signature)
  ------------------
  |  Branch (250:7): [True: 2.13k, False: 7.97k]
  ------------------
  251|  2.13k|			return &vips_icc_info_table[i];
  252|       |
  253|      3|	return NULL;
  254|  2.13k|}
icc_transform.c:vips_image_is_profile_compatible:
  553|    547|{
  554|    547|	switch (image->Type) {
  555|      0|	case VIPS_INTERPRETATION_B_W:
  ------------------
  |  Branch (555:2): [True: 0, False: 547]
  ------------------
  556|      0|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (556:2): [True: 0, False: 547]
  ------------------
  557|       |		/* The ICC profile needs to be monochrome.
  558|       |		 */
  559|      0|		return profile_bands == 1;
  560|       |
  561|      0|	case VIPS_INTERPRETATION_XYZ:
  ------------------
  |  Branch (561:2): [True: 0, False: 547]
  ------------------
  562|      0|	case VIPS_INTERPRETATION_LAB:
  ------------------
  |  Branch (562:2): [True: 0, False: 547]
  ------------------
  563|      0|	case VIPS_INTERPRETATION_LABQ:
  ------------------
  |  Branch (563:2): [True: 0, False: 547]
  ------------------
  564|      0|	case VIPS_INTERPRETATION_RGB:
  ------------------
  |  Branch (564:2): [True: 0, False: 547]
  ------------------
  565|      0|	case VIPS_INTERPRETATION_CMC:
  ------------------
  |  Branch (565:2): [True: 0, False: 547]
  ------------------
  566|      0|	case VIPS_INTERPRETATION_LCH:
  ------------------
  |  Branch (566:2): [True: 0, False: 547]
  ------------------
  567|      0|	case VIPS_INTERPRETATION_LABS:
  ------------------
  |  Branch (567:2): [True: 0, False: 547]
  ------------------
  568|     19|	case VIPS_INTERPRETATION_sRGB:
  ------------------
  |  Branch (568:2): [True: 19, False: 528]
  ------------------
  569|     19|	case VIPS_INTERPRETATION_YXY:
  ------------------
  |  Branch (569:2): [True: 0, False: 547]
  ------------------
  570|     19|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (570:2): [True: 0, False: 547]
  ------------------
  571|     19|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (571:2): [True: 0, False: 547]
  ------------------
  572|     19|	case VIPS_INTERPRETATION_HSV:
  ------------------
  |  Branch (572:2): [True: 0, False: 547]
  ------------------
  573|       |		/* The band count in the ICC profile must correspond to that of
  574|       |		 * the image, with a maximum of 3 bands allowed.
  575|       |		 */
  576|     19|		return VIPS_MIN(3, image->Bands) == profile_bands;
  ------------------
  |  |   55|     19|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 19]
  |  |  ------------------
  ------------------
  577|       |
  578|    528|	case VIPS_INTERPRETATION_CMYK:
  ------------------
  |  Branch (578:2): [True: 528, False: 19]
  ------------------
  579|       |		/* CMYK images can only be imported if the ICC-profile has at
  580|       |		 * least 4 bands thereby blocking the usage of RGB profiles.
  581|       |		 */
  582|    528|		return profile_bands >= 4;
  583|       |
  584|      0|	case VIPS_INTERPRETATION_MULTIBAND:
  ------------------
  |  Branch (584:2): [True: 0, False: 547]
  ------------------
  585|      0|	case VIPS_INTERPRETATION_HISTOGRAM:
  ------------------
  |  Branch (585:2): [True: 0, False: 547]
  ------------------
  586|      0|	case VIPS_INTERPRETATION_MATRIX:
  ------------------
  |  Branch (586:2): [True: 0, False: 547]
  ------------------
  587|      0|	case VIPS_INTERPRETATION_FOURIER:
  ------------------
  |  Branch (587:2): [True: 0, False: 547]
  ------------------
  588|      0|	default:
  ------------------
  |  Branch (588:2): [True: 0, False: 547]
  ------------------
  589|      0|		return image->Bands >= profile_bands;
  590|    547|	}
  591|    547|}

vips_profile_load:
  195|    528|{
  196|    528|	va_list ap;
  197|    528|	int result;
  198|       |
  199|    528|	va_start(ap, profile);
  200|    528|	result = vips_call_split("profile_load", ap, name, profile);
  201|    528|	va_end(ap);
  202|       |
  203|    528|	return result;
  204|    528|}
profile_load.c:vips_profile_load_class_init:
  139|      1|{
  140|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  141|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  142|       |
  143|      1|	gobject_class->set_property = vips_object_set_property;
  144|      1|	gobject_class->get_property = vips_object_get_property;
  145|       |
  146|      1|	object_class->nickname = "profile_load";
  147|      1|	object_class->description = _("load named ICC profile");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  148|      1|	object_class->build = vips_profile_load_build;
  149|       |
  150|      1|	VIPS_ARG_STRING(class, "name", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  151|      1|		_("Name"),
  152|      1|		_("Profile name"),
  153|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  154|      1|		G_STRUCT_OFFSET(VipsProfileLoad, name),
  155|      1|		NULL);
  156|       |
  157|      1|	VIPS_ARG_BOXED(class, "profile", 2,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  158|      1|		_("Profile"),
  159|      1|		_("Loaded profile"),
  160|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  161|      1|		G_STRUCT_OFFSET(VipsProfileLoad, profile),
  162|      1|		VIPS_TYPE_BLOB);
  163|      1|}
profile_load.c:vips_profile_load_build:
  101|    189|{
  102|    189|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    189|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    189|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    189|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  103|    189|	VipsProfileLoad *load = (VipsProfileLoad *) object;
  104|       |
  105|    189|	size_t length;
  106|    189|	const void *data;
  107|    189|	VipsBlob *profile;
  108|       |
  109|    189|	if (VIPS_OBJECT_CLASS(vips_profile_load_parent_class)->build(object))
  ------------------
  |  |  435|    189|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    189|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    189|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (109:6): [True: 0, False: 189]
  ------------------
  110|      0|		return -1;
  111|       |
  112|    189|	if (g_ascii_strcasecmp(load->name, "none") == 0)
  ------------------
  |  Branch (112:6): [True: 0, False: 189]
  ------------------
  113|      0|		profile = NULL;
  114|    189|	else if ((data = vips_profile_fallback_get(load->name, &length)))
  ------------------
  |  Branch (114:11): [True: 189, False: 0]
  ------------------
  115|    189|		profile = vips_blob_new(
  116|    189|			(VipsCallbackFn) vips_area_free_cb, data, length);
  117|      0|	else if ((data = vips__file_read_name(load->name,
  ------------------
  |  Branch (117:11): [True: 0, False: 0]
  ------------------
  118|      0|				  vips__icc_dir(), &length)))
  119|      0|		profile = vips_blob_new(
  120|      0|			(VipsCallbackFn) vips_area_free_cb, data, length);
  121|      0|	else {
  122|      0|		vips_error(class->nickname,
  123|      0|			_("unable to load profile \"%s\""), load->name);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  124|      0|		return -1;
  125|      0|	}
  126|       |
  127|    189|	g_object_set(object, "profile", profile, NULL);
  128|       |
  129|    189|	if (profile) {
  ------------------
  |  Branch (129:6): [True: 189, False: 0]
  ------------------
  130|    189|		vips_area_unref((VipsArea *) profile);
  131|    189|		profile = NULL;
  132|    189|	}
  133|       |
  134|    189|	return 0;
  135|    189|}
profile_load.c:vips_profile_fallback_get:
   63|    189|{
   64|    189|	int i;
   65|    189|	VipsProfileFallback *fallback;
   66|       |
   67|    189|	for (i = 0; (fallback = vips__profile_fallback_table[i]); i++)
  ------------------
  |  Branch (67:14): [True: 189, False: 0]
  ------------------
   68|    189|		if (g_ascii_strcasecmp(fallback->name, name) == 0) {
  ------------------
  |  Branch (68:7): [True: 189, False: 0]
  ------------------
   69|    189|			void *data;
   70|    189|			GConverter *converter;
   71|    189|			GConverterResult res;
   72|    189|			gsize bytes_read;
   73|    189|			gsize bytes_written;
   74|       |
   75|    189|			data = g_malloc0(fallback->length);
   76|    189|			converter = G_CONVERTER(g_zlib_decompressor_new(
  ------------------
  |  |   33|    189|#define G_CONVERTER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_CONVERTER, GConverter))
  |  |  ------------------
  |  |  |  |  484|    189|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    189|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   77|    189|				G_ZLIB_COMPRESSOR_FORMAT_ZLIB));
   78|       |
   79|    189|			res = g_converter_convert(converter,
   80|    189|				fallback->data, fallback->length,
   81|    189|				data, fallback->length,
   82|    189|				G_CONVERTER_INPUT_AT_END,
   83|    189|				&bytes_read, &bytes_written, NULL);
   84|    189|			g_object_unref(converter);
   85|       |
   86|    189|			if (res == G_CONVERTER_FINISHED) {
  ------------------
  |  Branch (86:8): [True: 189, False: 0]
  ------------------
   87|    189|				*length = fallback->length;
   88|    189|				return data;
   89|    189|			}
   90|      0|			else {
   91|      0|				g_free(data);
   92|      0|				g_warning("fallback profile decompression failed");
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
   93|      0|			}
   94|    189|		}
   95|       |
   96|      0|	return NULL;
   97|    189|}
profile_load.c:vips_profile_load_init:
  167|    528|{
  168|    528|}

vips_rad2float:
  217|    102|{
  218|    102|	va_list ap;
  219|    102|	int result;
  220|       |
  221|    102|	va_start(ap, out);
  222|    102|	result = vips_call_split("rad2float", ap, in, out);
  223|    102|	va_end(ap);
  224|       |
  225|    102|	return result;
  226|    102|}
rad2float.c:vips_rad2float_class_init:
  178|      1|{
  179|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  180|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  181|       |
  182|      1|	object_class->nickname = "rad2float";
  183|      1|	object_class->description =
  184|      1|		_("unpack Radiance coding to float RGB");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  185|       |
  186|      1|	colour_class->process_line = vips_rad2float_line;
  187|      1|}
rad2float.c:vips_rad2float_line:
  166|    337|{
  167|    337|	COLR *inp = (COLR *) in[0];
  168|    337|	COLOR *outbuf = (COLOR *) out;
  169|       |
  170|    337|	int i;
  171|       |
  172|  7.12k|	for (i = 0; i < width; i++)
  ------------------
  |  Branch (172:14): [True: 6.78k, False: 337]
  ------------------
  173|  6.78k|		colr_color(outbuf[i], inp[i]);
  174|    337|}
rad2float.c:colr_color:
  144|  6.78k|{
  145|  6.78k|	if (clr[EXP] == 0)
  ------------------
  |  |  125|  6.78k|#define EXP 3	  /* exponent same for either format */
  ------------------
  |  Branch (145:6): [True: 1.72k, False: 5.05k]
  ------------------
  146|  1.72k|		col[RED] = col[GRN] = col[BLU] = 0.0;
  ------------------
  |  |  119|  1.72k|#define RED 0
  ------------------
              		col[RED] = col[GRN] = col[BLU] = 0.0;
  ------------------
  |  |  120|  1.72k|#define GRN 1
  ------------------
              		col[RED] = col[GRN] = col[BLU] = 0.0;
  ------------------
  |  |  121|  1.72k|#define BLU 2
  ------------------
  147|  5.05k|	else {
  148|  5.05k|		double f = ldexp(1.0, (int) clr[EXP] - (COLXS + 8));
  ------------------
  |  |  125|  5.05k|#define EXP 3	  /* exponent same for either format */
  ------------------
              		double f = ldexp(1.0, (int) clr[EXP] - (COLXS + 8));
  ------------------
  |  |  126|  5.05k|#define COLXS 128 /* excess used for exponent */
  ------------------
  149|       |
  150|  5.05k|		col[RED] = (clr[RED] + 0.5) * f;
  ------------------
  |  |  119|  5.05k|#define RED 0
  ------------------
              		col[RED] = (clr[RED] + 0.5) * f;
  ------------------
  |  |  119|  5.05k|#define RED 0
  ------------------
  151|  5.05k|		col[GRN] = (clr[GRN] + 0.5) * f;
  ------------------
  |  |  120|  5.05k|#define GRN 1
  ------------------
              		col[GRN] = (clr[GRN] + 0.5) * f;
  ------------------
  |  |  120|  5.05k|#define GRN 1
  ------------------
  152|  5.05k|		col[BLU] = (clr[BLU] + 0.5) * f;
  ------------------
  |  |  121|  5.05k|#define BLU 2
  ------------------
              		col[BLU] = (clr[BLU] + 0.5) * f;
  ------------------
  |  |  121|  5.05k|#define BLU 2
  ------------------
  153|  5.05k|	}
  154|  6.78k|}
rad2float.c:vips_rad2float_init:
  191|    102|{
  192|    102|	VipsColour *colour = VIPS_COLOUR(rad2float);
  ------------------
  |  |   42|    102|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    102|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    102|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|    102|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  193|    102|	VipsColourCode *code = VIPS_COLOUR_CODE(rad2float);
  ------------------
  |  |  135|    102|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    102|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    102|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|    102|		VIPS_TYPE_COLOUR_CODE, VipsColourCode))
  ------------------
  194|       |
  195|    102|	colour->coding = VIPS_CODING_NONE;
  196|    102|	colour->interpretation = VIPS_INTERPRETATION_scRGB;
  197|    102|	colour->format = VIPS_FORMAT_FLOAT;
  198|    102|	colour->bands = 3;
  199|       |
  200|    102|	code->input_coding = VIPS_CODING_RAD;
  201|    102|}

sRGB2HSV.c:vips_sRGB2HSV_class_init:
  128|      1|{
  129|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  130|      1|	VipsColourClass *colour_class = VIPS_COLOUR_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  131|       |
  132|      1|	object_class->nickname = "sRGB2HSV";
  133|      1|	object_class->description = _("transform sRGB to HSV");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  134|       |
  135|      1|	colour_class->process_line = vips_sRGB2HSV_line;
  136|      1|}

sRGB2scRGB.c:vips_sRGB2scRGB_class_init:
  273|      1|{
  274|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  275|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  276|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  277|       |
  278|      1|	gobject_class->set_property = vips_object_set_property;
  279|      1|	gobject_class->get_property = vips_object_get_property;
  280|       |
  281|      1|	object_class->nickname = "sRGB2scRGB";
  282|      1|	object_class->description = _("convert an sRGB image to scRGB");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  283|      1|	object_class->build = vips_sRGB2scRGB_build;
  284|       |
  285|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  286|       |
  287|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  288|      1|		_("Input"),
  289|      1|		_("Input image"),
  290|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  291|      1|		G_STRUCT_OFFSET(VipssRGB2scRGB, in));
  292|       |
  293|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  294|      1|		_("Output"),
  295|      1|		_("Output image"),
  296|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  297|      1|		G_STRUCT_OFFSET(VipssRGB2scRGB, out));
  298|      1|}

scRGB2BW.c:vips_scRGB2BW_class_init:
  222|      1|{
  223|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  224|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  225|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  226|       |
  227|      1|	gobject_class->set_property = vips_object_set_property;
  228|      1|	gobject_class->get_property = vips_object_get_property;
  229|       |
  230|      1|	object_class->nickname = "scRGB2BW";
  231|      1|	object_class->description = _("convert scRGB to BW");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  232|      1|	object_class->build = vips_scRGB2BW_build;
  233|       |
  234|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  235|       |
  236|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  237|      1|		_("Input"),
  238|      1|		_("Input image"),
  239|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  240|      1|		G_STRUCT_OFFSET(VipsscRGB2BW, in));
  241|       |
  242|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  243|      1|		_("Output"),
  244|      1|		_("Output image"),
  245|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  246|      1|		G_STRUCT_OFFSET(VipsscRGB2BW, out));
  247|       |
  248|      1|	VIPS_ARG_INT(class, "depth", 130,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  249|      1|		_("Depth"),
  250|      1|		_("Output device space depth in bits"),
  251|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  252|      1|		G_STRUCT_OFFSET(VipsscRGB2BW, depth),
  253|      1|		8, 16, 8);
  254|      1|}

scRGB2XYZ.c:vips_scRGB2XYZ_class_init:
  176|      1|{
  177|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  178|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  179|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  180|       |
  181|      1|	gobject_class->set_property = vips_object_set_property;
  182|      1|	gobject_class->get_property = vips_object_get_property;
  183|       |
  184|      1|	object_class->nickname = "scRGB2XYZ";
  185|      1|	object_class->description = _("transform scRGB to XYZ");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  186|      1|	object_class->build = vips_scRGB2XYZ_build;
  187|       |
  188|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  189|       |
  190|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  191|      1|		_("Input"),
  192|      1|		_("Input image"),
  193|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  194|      1|		G_STRUCT_OFFSET(VipsscRGB2XYZ, in));
  195|       |
  196|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  197|      1|		_("Output"),
  198|      1|		_("Output image"),
  199|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  200|      1|		G_STRUCT_OFFSET(VipsscRGB2XYZ, out));
  201|      1|}

vips_scRGB2sRGB:
  316|    832|{
  317|    832|	va_list ap;
  318|    832|	int result;
  319|       |
  320|    832|	va_start(ap, out);
  321|    832|	result = vips_call_split("scRGB2sRGB", ap, in, out);
  322|    832|	va_end(ap);
  323|       |
  324|    832|	return result;
  325|    832|}
scRGB2sRGB.c:vips_scRGB2sRGB_class_init:
  255|      1|{
  256|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  257|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  258|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  259|       |
  260|      1|	gobject_class->set_property = vips_object_set_property;
  261|      1|	gobject_class->get_property = vips_object_get_property;
  262|       |
  263|      1|	object_class->nickname = "scRGB2sRGB";
  264|      1|	object_class->description = _("convert an scRGB image to sRGB");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  265|      1|	object_class->build = vips_scRGB2sRGB_build;
  266|       |
  267|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  268|       |
  269|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  270|      1|		_("Input"),
  271|      1|		_("Input image"),
  272|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  273|      1|		G_STRUCT_OFFSET(VipsscRGB2sRGB, in));
  274|       |
  275|      1|	VIPS_ARG_IMAGE(class, "out", 100,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  276|      1|		_("Output"),
  277|      1|		_("Output image"),
  278|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  279|      1|		G_STRUCT_OFFSET(VipsscRGB2sRGB, out));
  280|       |
  281|      1|	VIPS_ARG_INT(class, "depth", 130,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  282|      1|		_("Depth"),
  283|      1|		_("Output device space depth in bits"),
  284|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  285|      1|		G_STRUCT_OFFSET(VipsscRGB2sRGB, depth),
  286|      1|		8, 16, 8);
  287|      1|}
scRGB2sRGB.c:vips_scRGB2sRGB_build:
  186|    832|{
  187|    832|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    832|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    832|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    832|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  188|    832|	VipsscRGB2sRGB *scRGB2sRGB = (VipsscRGB2sRGB *) object;
  189|       |
  190|    832|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 2);
  191|       |
  192|    832|	VipsImage *in;
  193|    832|	VipsBandFormat format;
  194|    832|	VipsInterpretation interpretation;
  195|    832|	VipsImage *out;
  196|       |
  197|    832|	if (VIPS_OBJECT_CLASS(vips_scRGB2sRGB_parent_class)->build(object))
  ------------------
  |  |  435|    832|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    832|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    832|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (197:6): [True: 0, False: 832]
  ------------------
  198|      0|		return -1;
  199|       |
  200|    832|	in = scRGB2sRGB->in;
  201|    832|	if (vips_check_bands_atleast(class->nickname, in, 3))
  ------------------
  |  Branch (201:6): [True: 0, False: 832]
  ------------------
  202|      0|		return -1;
  203|       |
  204|       |	// we are changing the gamma, so any profile on the image can no longer
  205|       |	// work (and will cause horrible problems in any downstream colour
  206|       |	// handling)
  207|    832|	if (vips_copy(in, &t[0], NULL))
  ------------------
  |  Branch (207:6): [True: 0, False: 832]
  ------------------
  208|      0|		return -1;
  209|    832|	in = t[0];
  210|    832|	vips_image_remove(in, VIPS_META_ICC_NAME);
  ------------------
  |  |   78|    832|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  211|       |
  212|    832|	switch (scRGB2sRGB->depth) {
  213|      0|	case 16:
  ------------------
  |  Branch (213:2): [True: 0, False: 832]
  ------------------
  214|      0|		interpretation = VIPS_INTERPRETATION_RGB16;
  215|      0|		format = VIPS_FORMAT_USHORT;
  216|      0|		break;
  217|       |
  218|    832|	case 8:
  ------------------
  |  Branch (218:2): [True: 832, False: 0]
  ------------------
  219|    832|		interpretation = VIPS_INTERPRETATION_sRGB;
  220|    832|		format = VIPS_FORMAT_UCHAR;
  221|    832|		break;
  222|       |
  223|      0|	default:
  ------------------
  |  Branch (223:2): [True: 0, False: 832]
  ------------------
  224|      0|		vips_error(class->nickname, "%s", _("depth must be 8 or 16"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  225|      0|		return -1;
  226|    832|	}
  227|       |
  228|    832|	if (vips_cast_float(in, &t[1], NULL))
  ------------------
  |  Branch (228:6): [True: 0, False: 832]
  ------------------
  229|      0|		return -1;
  230|    832|	in = t[1];
  231|       |
  232|    832|	out = vips_image_new();
  233|    832|	if (vips_image_pipelinev(out,
  ------------------
  |  Branch (233:6): [True: 0, False: 832]
  ------------------
  234|    832|			VIPS_DEMAND_STYLE_THINSTRIP, in, NULL)) {
  235|      0|		g_object_unref(out);
  236|      0|		return -1;
  237|      0|	}
  238|    832|	out->Type = interpretation;
  239|    832|	out->BandFmt = format;
  240|       |
  241|    832|	if (vips_image_generate(out,
  ------------------
  |  Branch (241:6): [True: 0, False: 832]
  ------------------
  242|    832|			vips_start_one, vips_scRGB2sRGB_gen, vips_stop_one,
  243|    832|			in, scRGB2sRGB)) {
  244|      0|		g_object_unref(out);
  245|      0|		return -1;
  246|      0|	}
  247|       |
  248|    832|	g_object_set(object, "out", out, NULL);
  249|       |
  250|    832|	return 0;
  251|    832|}
scRGB2sRGB.c:vips_scRGB2sRGB_gen:
  152|  2.85k|{
  153|  2.85k|	VipsRegion *ir = (VipsRegion *) seq;
  154|  2.85k|	VipsscRGB2sRGB *scRGB2sRGB = (VipsscRGB2sRGB *) b;
  155|  2.85k|	VipsRect *r = &out_region->valid;
  156|  2.85k|	VipsImage *in = ir->im;
  157|       |
  158|  2.85k|	int y;
  159|       |
  160|  2.85k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (160:6): [True: 318, False: 2.53k]
  ------------------
  161|    318|		return -1;
  162|       |
  163|  2.85k|	VIPS_GATE_START("vips_scRGB2sRGB_gen: work");
  ------------------
  |  |   41|  2.53k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.53k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.53k|	{ \
  |  |   43|  2.53k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 2.53k]
  |  |  ------------------
  |  |   44|  2.53k|			vips__thread_gate_start(NAME); \
  |  |   45|  2.53k|	} \
  |  |   46|  2.85k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.85k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  164|       |
  165|  37.4k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (165:14): [True: 34.8k, False: 2.53k]
  ------------------
  166|  34.8k|		float *p = (float *)
  167|  34.8k|			VIPS_REGION_ADDR(ir, r->left, r->top + y);
  ------------------
  |  |  227|  34.8k|	((R)->data + \
  |  |  228|  34.8k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  34.8k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  34.8k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  34.8k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  34.8k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  34.8k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|  34.8k|		VipsPel *q = (VipsPel *)
  169|  34.8k|			VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|  34.8k|	((R)->data + \
  |  |  228|  34.8k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  34.8k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  34.8k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  34.8k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  34.8k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  34.8k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  170|       |
  171|  34.8k|		if (scRGB2sRGB->depth == 16)
  ------------------
  |  Branch (171:7): [True: 0, False: 34.8k]
  ------------------
  172|      0|			vips_scRGB2sRGB_line_16((unsigned short *) q, p,
  173|      0|				in->Bands - 3, r->width);
  174|  34.8k|		else
  175|  34.8k|			vips_scRGB2sRGB_line_8(q, p,
  176|  34.8k|				in->Bands - 3, r->width);
  177|  34.8k|	}
  178|       |
  179|  2.53k|	VIPS_GATE_STOP("vips_scRGB2sRGB_gen: work");
  ------------------
  |  |   49|  2.53k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.53k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  2.53k|	{ \
  |  |   51|  2.53k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 2.53k]
  |  |  ------------------
  |  |   52|  2.53k|			vips__thread_gate_stop(NAME); \
  |  |   53|  2.53k|	} \
  |  |   54|  2.53k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.53k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|       |
  181|  2.53k|	return 0;
  182|  2.85k|}
scRGB2sRGB.c:vips_scRGB2sRGB_line_8:
   92|  34.8k|{
   93|  34.8k|	int i, j;
   94|       |
   95|  2.65M|	for (i = 0; i < width; i++) {
  ------------------
  |  Branch (95:14): [True: 2.62M, False: 34.8k]
  ------------------
   96|  2.62M|		float R = p[0];
   97|  2.62M|		float G = p[1];
   98|  2.62M|		float B = p[2];
   99|       |
  100|  2.62M|		int r, g, b;
  101|       |
  102|  2.62M|		vips_col_scRGB2sRGB_8(R, G, B, &r, &g, &b, NULL);
  103|       |
  104|  2.62M|		p += 3;
  105|       |
  106|  2.62M|		q[0] = r;
  107|  2.62M|		q[1] = g;
  108|  2.62M|		q[2] = b;
  109|       |
  110|  2.62M|		q += 3;
  111|       |
  112|  2.82M|		for (j = 0; j < extra_bands; j++)
  ------------------
  |  Branch (112:15): [True: 199k, False: 2.62M]
  ------------------
  113|  2.62M|			q[j] = VIPS_CLIP(0, (int) (p[j] * 255.0), UCHAR_MAX);
  ------------------
  |  |   57|   199k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|   399k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 13.6k, False: 186k]
  |  |  |  |  |  Branch (54:32): [True: 1.32k, False: 198k]
  |  |  |  |  |  Branch (54:44): [True: 1.32k, False: 185k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  114|  2.62M|		p += extra_bands;
  115|  2.62M|		q += extra_bands;
  116|  2.62M|	}
  117|  34.8k|}
scRGB2sRGB.c:vips_scRGB2sRGB_init:
  291|    832|{
  292|    832|	scRGB2sRGB->depth = 8;
  293|    832|}

vips_addalpha:
  115|  8.74k|{
  116|  8.74k|	va_list ap;
  117|  8.74k|	int result;
  118|       |
  119|  8.74k|	va_start(ap, out);
  120|  8.74k|	result = vips_call_split("addalpha", ap, in, out);
  121|  8.74k|	va_end(ap);
  122|       |
  123|  8.74k|	return result;
  124|  8.74k|}
addalpha.c:vips_addalpha_class_init:
   75|      1|{
   76|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   77|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   78|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
   79|       |
   80|      1|	gobject_class->set_property = vips_object_set_property;
   81|      1|	gobject_class->get_property = vips_object_get_property;
   82|       |
   83|      1|	vobject_class->nickname = "addalpha";
   84|      1|	vobject_class->description = _("append an alpha channel");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   85|      1|	vobject_class->build = vips_addalpha_build;
   86|       |
   87|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
   88|       |
   89|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
   90|      1|		_("Input"),
   91|      1|		_("Input image"),
   92|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
   93|      1|		G_STRUCT_OFFSET(VipsAddAlpha, in));
   94|      1|}
addalpha.c:vips_addalpha_build:
   57|  8.74k|{
   58|  8.74k|	VipsAddAlpha *addalpha = (VipsAddAlpha *) object;
   59|  8.74k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  8.74k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  8.74k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  8.74k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  8.74k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
   60|  8.74k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 2);
   61|  8.74k|	double max_alpha = vips_interpretation_max_alpha(addalpha->in->Type);
   62|       |
   63|  8.74k|	if (VIPS_OBJECT_CLASS(vips_addalpha_parent_class)->build(object))
  ------------------
  |  |  435|  8.74k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  8.74k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  8.74k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (63:6): [True: 0, False: 8.74k]
  ------------------
   64|      0|		return -1;
   65|       |
   66|  8.74k|	if (vips_bandjoin_const1(addalpha->in, &t[0], max_alpha, NULL) ||
  ------------------
  |  Branch (66:6): [True: 0, False: 8.74k]
  ------------------
   67|  8.74k|		vips_image_write(t[0], conversion->out))
  ------------------
  |  Branch (67:3): [True: 0, False: 8.74k]
  ------------------
   68|      0|		return -1;
   69|       |
   70|  8.74k|	return 0;
   71|  8.74k|}
addalpha.c:vips_addalpha_init:
   98|  8.74k|{
   99|  8.74k|}

arrayjoin.c:vips_arrayjoin_class_init:
  377|      1|{
  378|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  379|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  380|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  381|       |
  382|      1|	VIPS_DEBUG_MSG("vips_arrayjoin_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  383|       |
  384|      1|	gobject_class->set_property = vips_object_set_property;
  385|      1|	gobject_class->get_property = vips_object_get_property;
  386|       |
  387|      1|	vobject_class->nickname = "arrayjoin";
  388|      1|	vobject_class->description = _("join an array of images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  389|      1|	vobject_class->build = vips_arrayjoin_build;
  390|       |
  391|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  392|       |
  393|      1|	VIPS_ARG_BOXED(class, "in", -1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  394|      1|		_("Input"),
  395|      1|		_("Array of input images"),
  396|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  397|      1|		G_STRUCT_OFFSET(VipsArrayjoin, in),
  398|      1|		VIPS_TYPE_ARRAY_IMAGE);
  399|       |
  400|      1|	VIPS_ARG_INT(class, "across", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  401|      1|		_("Across"),
  402|      1|		_("Number of images across grid"),
  403|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  404|      1|		G_STRUCT_OFFSET(VipsArrayjoin, across),
  405|      1|		1, 1000000, 1);
  406|       |
  407|      1|	VIPS_ARG_INT(class, "shim", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  408|      1|		_("Shim"),
  409|      1|		_("Pixels between images"),
  410|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  411|      1|		G_STRUCT_OFFSET(VipsArrayjoin, shim),
  412|      1|		0, 1000000, 0);
  413|       |
  414|      1|	VIPS_ARG_BOXED(class, "background", 6,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  415|      1|		_("Background"),
  416|      1|		_("Colour for new pixels"),
  417|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  418|      1|		G_STRUCT_OFFSET(VipsArrayjoin, background),
  419|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  420|       |
  421|      1|	VIPS_ARG_ENUM(class, "halign", 7,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  422|      1|		_("Horizontal align"),
  423|      1|		_("Align on the left, centre or right"),
  424|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  425|      1|		G_STRUCT_OFFSET(VipsArrayjoin, halign),
  426|      1|		VIPS_TYPE_ALIGN, VIPS_ALIGN_LOW);
  427|       |
  428|      1|	VIPS_ARG_ENUM(class, "valign", 8,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  429|      1|		_("Vertical align"),
  430|      1|		_("Align on the top, centre or bottom"),
  431|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  432|      1|		G_STRUCT_OFFSET(VipsArrayjoin, valign),
  433|      1|		VIPS_TYPE_ALIGN, VIPS_ALIGN_LOW);
  434|       |
  435|      1|	VIPS_ARG_INT(class, "hspacing", 9,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  436|      1|		_("Horizontal spacing"),
  437|      1|		_("Horizontal spacing between images"),
  438|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  439|      1|		G_STRUCT_OFFSET(VipsArrayjoin, hspacing),
  440|      1|		1, 1000000, 1);
  441|       |
  442|      1|	VIPS_ARG_INT(class, "vspacing", 10,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  443|      1|		_("Vertical spacing"),
  444|      1|		_("Vertical spacing between images"),
  445|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  446|      1|		G_STRUCT_OFFSET(VipsArrayjoin, vspacing),
  447|      1|		1, 1000000, 1);
  448|      1|}

vips_autorot_remove_angle:
   98|  7.06k|{
   99|  7.06k|	(void) vips_image_remove(image, VIPS_META_ORIENTATION);
  ------------------
  |  |  149|  7.06k|#define VIPS_META_ORIENTATION "orientation"
  ------------------
  100|  7.06k|	(void) vips_image_map(image, vips_autorot_remove_angle_sub, NULL);
  101|  7.06k|}
autorot.c:vips_autorot_class_init:
  195|      1|{
  196|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  197|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  198|       |
  199|      1|	gobject_class->set_property = vips_object_set_property;
  200|      1|	gobject_class->get_property = vips_object_get_property;
  201|       |
  202|      1|	vobject_class->nickname = "autorot";
  203|      1|	vobject_class->description = _("autorotate image by exif tag");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  204|      1|	vobject_class->build = vips_autorot_build;
  205|       |
  206|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  207|      1|		_("Input"),
  208|      1|		_("Input image"),
  209|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  210|      1|		G_STRUCT_OFFSET(VipsAutorot, in));
  211|       |
  212|      1|	VIPS_ARG_ENUM(class, "angle", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  213|      1|		_("Angle"),
  214|      1|		_("Angle image was rotated by"),
  215|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  216|      1|		G_STRUCT_OFFSET(VipsAutorot, angle),
  217|      1|		VIPS_TYPE_ANGLE, VIPS_ANGLE_D0);
  218|       |
  219|      1|	VIPS_ARG_BOOL(class, "flip", 7,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  220|      1|		_("Flip"),
  221|      1|		_("Whether the image was flipped or not"),
  222|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  223|      1|		G_STRUCT_OFFSET(VipsAutorot, flip),
  224|      1|		FALSE);
  225|      1|}
autorot.c:vips_autorot_remove_angle_sub:
   76|  81.2k|{
   77|  81.2k|	if (strcmp(field, "exif-ifd0-Orientation") == 0) {
  ------------------
  |  Branch (77:6): [True: 0, False: 81.2k]
  ------------------
   78|       |#ifdef DEBUG
   79|       |		printf("vips_autorot_remove_angle: %s\n", field);
   80|       |#endif /*DEBUG*/
   81|       |
   82|      0|		(void) vips_image_remove(image, field);
   83|      0|	}
   84|       |
   85|  81.2k|	return NULL;
   86|  81.2k|}

bandary.c:vips_bandary_class_init:
  246|      1|{
  247|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  248|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  249|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  250|       |
  251|      1|	VIPS_DEBUG_MSG("vips_bandary_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  252|       |
  253|      1|	gobject_class->set_property = vips_object_set_property;
  254|      1|	gobject_class->get_property = vips_object_get_property;
  255|       |
  256|      1|	vobject_class->nickname = "bandary";
  257|      1|	vobject_class->description = _("operations on image bands");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  258|      1|	vobject_class->build = vips_bandary_build;
  259|       |
  260|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  261|      1|}
bandary.c:vips_bandary_build:
  195|  12.4k|{
  196|  12.4k|	VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  12.4k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  12.4k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  12.4k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  197|  12.4k|	VipsBandaryClass *class = VIPS_BANDARY_GET_CLASS(object);
  ------------------
  |  |   52|  12.4k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  12.4k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  12.4k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|  12.4k|		VIPS_TYPE_BANDARY, VipsBandaryClass))
  ------------------
  198|  12.4k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  12.4k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  12.4k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  12.4k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  12.4k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  199|  12.4k|	VipsBandary *bandary = VIPS_BANDARY(object);
  ------------------
  |  |   42|  12.4k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  12.4k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  12.4k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  12.4k|		VIPS_TYPE_BANDARY, VipsBandary))
  ------------------
  200|       |
  201|  12.4k|	int i;
  202|  12.4k|	VipsImage **decode;
  203|  12.4k|	VipsImage **format;
  204|  12.4k|	VipsImage **size;
  205|       |
  206|  12.4k|	if (VIPS_OBJECT_CLASS(vips_bandary_parent_class)->build(object))
  ------------------
  |  |  435|  12.4k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  12.4k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  12.4k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (206:6): [True: 0, False: 12.4k]
  ------------------
  207|      0|		return -1;
  208|       |
  209|  12.4k|	if (bandary->n <= 0) {
  ------------------
  |  Branch (209:6): [True: 0, False: 12.4k]
  ------------------
  210|      0|		vips_error(object_class->nickname,
  211|      0|			"%s", _("no input images"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  212|      0|		return -1;
  213|      0|	}
  214|       |
  215|  12.4k|	decode = (VipsImage **) vips_object_local_array(object, bandary->n);
  216|  12.4k|	format = (VipsImage **) vips_object_local_array(object, bandary->n);
  217|  12.4k|	size = (VipsImage **) vips_object_local_array(object, bandary->n);
  218|       |
  219|  29.3k|	for (i = 0; i < bandary->n; i++)
  ------------------
  |  Branch (219:14): [True: 16.9k, False: 12.4k]
  ------------------
  220|  16.9k|		if (vips_image_decode(bandary->in[i], &decode[i]))
  ------------------
  |  Branch (220:7): [True: 0, False: 16.9k]
  ------------------
  221|      0|			return -1;
  222|  12.4k|	if (vips__formatalike_vec(decode, format, bandary->n) ||
  ------------------
  |  Branch (222:6): [True: 0, False: 12.4k]
  ------------------
  223|  12.4k|		vips__sizealike_vec(format, size, bandary->n))
  ------------------
  |  Branch (223:3): [True: 0, False: 12.4k]
  ------------------
  224|      0|		return -1;
  225|  12.4k|	bandary->ready = size;
  226|       |
  227|  12.4k|	if (vips_image_pipeline_array(conversion->out,
  ------------------
  |  Branch (227:6): [True: 0, False: 12.4k]
  ------------------
  228|  12.4k|			VIPS_DEMAND_STYLE_THINSTRIP, bandary->ready))
  229|      0|		return -1;
  230|       |
  231|  12.4k|	conversion->out->Bands = bandary->out_bands;
  232|  12.4k|	if (class->format_table)
  ------------------
  |  Branch (232:6): [True: 0, False: 12.4k]
  ------------------
  233|      0|		conversion->out->BandFmt =
  234|      0|			class->format_table[bandary->ready[0]->BandFmt];
  235|       |
  236|  12.4k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (236:6): [True: 0, False: 12.4k]
  ------------------
  237|  12.4k|			vips_bandary_start, vips_bandary_gen, vips_bandary_stop,
  238|  12.4k|			bandary->ready, bandary))
  239|      0|		return -1;
  240|       |
  241|  12.4k|	return 0;
  242|  12.4k|}
bandary.c:vips_bandary_start:
  105|  12.3k|{
  106|  12.3k|	VipsImage **in = (VipsImage **) a;
  107|  12.3k|	VipsBandary *bandary = (VipsBandary *) b;
  108|       |
  109|  12.3k|	VipsBandarySequence *seq;
  110|  12.3k|	int i, n;
  111|       |
  112|  12.3k|	if (!(seq = VIPS_NEW(NULL, VipsBandarySequence)))
  ------------------
  |  |   70|  12.3k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  12.3k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  12.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  12.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  12.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (112:6): [True: 0, False: 12.3k]
  ------------------
  113|      0|		return NULL;
  114|       |
  115|  12.3k|	seq->bandary = bandary;
  116|  12.3k|	seq->ir = NULL;
  117|  12.3k|	seq->p = NULL;
  118|  12.3k|	seq->pixels = NULL;
  119|       |
  120|       |	/* How many images?
  121|       |	 */
  122|  29.3k|	for (n = 0; in[n]; n++)
  ------------------
  |  Branch (122:14): [True: 16.9k, False: 12.3k]
  ------------------
  123|  16.9k|		;
  124|       |
  125|       |	/* Allocate space for region array.
  126|       |	 */
  127|  12.3k|	if (!(seq->ir = VIPS_ARRAY(NULL, n + 1, VipsRegion *))) {
  ------------------
  |  |   72|  12.3k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  12.3k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  12.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  12.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  12.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (127:6): [True: 0, False: 12.3k]
  ------------------
  128|      0|		vips_bandary_stop(seq, NULL, NULL);
  129|      0|		return NULL;
  130|      0|	}
  131|       |
  132|       |	/* Create a set of regions.
  133|       |	 */
  134|  29.3k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (134:14): [True: 16.9k, False: 12.3k]
  ------------------
  135|  16.9k|		if (!(seq->ir[i] = vips_region_new(in[i]))) {
  ------------------
  |  Branch (135:7): [True: 0, False: 16.9k]
  ------------------
  136|      0|			vips_bandary_stop(seq, NULL, NULL);
  137|      0|			return NULL;
  138|      0|		}
  139|  12.3k|	seq->ir[n] = NULL;
  140|       |
  141|       |	/* Input pointers.
  142|       |	 */
  143|  12.3k|	if (!(seq->p = VIPS_ARRAY(NULL, n + 1, VipsPel *))) {
  ------------------
  |  |   72|  12.3k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  12.3k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  12.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  12.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  12.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (143:6): [True: 0, False: 12.3k]
  ------------------
  144|      0|		vips_bandary_stop(seq, NULL, NULL);
  145|      0|		return NULL;
  146|      0|	}
  147|       |
  148|       |	/* Pixel buffer. This is used as working space by some subclasses.
  149|       |	 */
  150|  12.3k|	if (!(seq->pixels = VIPS_ARRAY(NULL,
  ------------------
  |  |   72|  12.3k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  12.3k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  12.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  12.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  12.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (150:6): [True: 0, False: 12.3k]
  ------------------
  151|  12.3k|			  n * VIPS_IMAGE_SIZEOF_PEL(bandary->ready[0]), VipsPel))) {
  152|      0|		vips_bandary_stop(seq, NULL, NULL);
  153|      0|		return NULL;
  154|      0|	}
  155|       |
  156|  12.3k|	return seq;
  157|  12.3k|}
bandary.c:vips_bandary_gen:
  162|  25.9k|{
  163|  25.9k|	VipsBandarySequence *seq = (VipsBandarySequence *) vseq;
  164|  25.9k|	VipsBandary *bandary = (VipsBandary *) b;
  165|  25.9k|	VipsBandaryClass *class = VIPS_BANDARY_GET_CLASS(bandary);
  ------------------
  |  |   52|  25.9k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  25.9k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  25.9k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|  25.9k|		VIPS_TYPE_BANDARY, VipsBandaryClass))
  ------------------
  166|  25.9k|	VipsRect *r = &out_region->valid;
  167|       |
  168|  25.9k|	VipsPel *q;
  169|  25.9k|	int y, i;
  170|       |
  171|  25.9k|	if (vips_reorder_prepare_many(out_region->im, seq->ir, r))
  ------------------
  |  Branch (171:6): [True: 5.99k, False: 19.9k]
  ------------------
  172|  5.99k|		return -1;
  173|  50.6k|	for (i = 0; i < bandary->n; i++)
  ------------------
  |  Branch (173:14): [True: 30.6k, False: 19.9k]
  ------------------
  174|  30.6k|		seq->p[i] = VIPS_REGION_ADDR(seq->ir[i], r->left, r->top);
  ------------------
  |  |  227|  50.6k|	((R)->data + \
  |  |  228|  50.6k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  30.6k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  50.6k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  30.6k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  30.6k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  30.6k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  175|  19.9k|	seq->p[i] = NULL;
  176|  19.9k|	q = VIPS_REGION_ADDR(out_region, r->left, r->top);
  ------------------
  |  |  227|  19.9k|	((R)->data + \
  |  |  228|  19.9k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  19.9k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  19.9k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  19.9k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  19.9k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  19.9k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  177|       |
  178|  19.9k|	VIPS_GATE_START("vips_bandary_gen: work");
  ------------------
  |  |   41|  19.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  19.9k|	{ \
  |  |   43|  19.9k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 19.9k]
  |  |  ------------------
  |  |   44|  19.9k|			vips__thread_gate_start(NAME); \
  |  |   45|  19.9k|	} \
  |  |   46|  19.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  179|       |
  180|   392k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (180:14): [True: 372k, False: 19.9k]
  ------------------
  181|   372k|		class->process_line(seq, q, seq->p, r->width);
  182|       |
  183|   987k|		for (i = 0; i < bandary->n; i++)
  ------------------
  |  Branch (183:15): [True: 615k, False: 372k]
  ------------------
  184|   615k|			seq->p[i] += VIPS_REGION_LSKIP(seq->ir[i]);
  ------------------
  |  |  195|   615k|	((size_t) ((R)->bpl))
  ------------------
  185|   372k|		q += VIPS_REGION_LSKIP(out_region);
  ------------------
  |  |  195|   372k|	((size_t) ((R)->bpl))
  ------------------
  186|   372k|	}
  187|       |
  188|  19.9k|	VIPS_GATE_STOP("vips_bandary_gen: work");
  ------------------
  |  |   49|  19.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  19.9k|	{ \
  |  |   51|  19.9k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 19.9k]
  |  |  ------------------
  |  |   52|  19.9k|			vips__thread_gate_stop(NAME); \
  |  |   53|  19.9k|	} \
  |  |   54|  19.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|       |
  190|  19.9k|	return 0;
  191|  25.9k|}
bandary.c:vips_bandary_stop:
   84|  12.3k|{
   85|  12.3k|	VipsBandarySequence *seq = (VipsBandarySequence *) vseq;
   86|       |
   87|  12.3k|	if (seq->ir) {
  ------------------
  |  Branch (87:6): [True: 12.3k, False: 0]
  ------------------
   88|  12.3k|		int i;
   89|       |
   90|  29.3k|		for (i = 0; seq->ir[i]; i++)
  ------------------
  |  Branch (90:15): [True: 16.9k, False: 12.3k]
  ------------------
   91|  16.9k|			VIPS_UNREF(seq->ir[i]);
  ------------------
  |  |   57|  12.3k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  16.9k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  16.9k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  16.9k|	{ \
  |  |  |  |   43|  16.9k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 16.9k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  16.9k|			(void) F((S)); \
  |  |  |  |   45|  16.9k|			(S) = 0; \
  |  |  |  |   46|  16.9k|		} \
  |  |  |  |   47|  16.9k|	} \
  |  |  |  |   48|  16.9k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  16.9k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   92|  12.3k|		VIPS_FREE(seq->ir);
  ------------------
  |  |   50|  12.3k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  12.3k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  12.3k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  12.3k|	{ \
  |  |  |  |   43|  12.3k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 12.3k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  12.3k|			(void) F((S)); \
  |  |  |  |   45|  12.3k|			(S) = 0; \
  |  |  |  |   46|  12.3k|		} \
  |  |  |  |   47|  12.3k|	} \
  |  |  |  |   48|  12.3k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  12.3k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   93|  12.3k|	}
   94|       |
   95|  12.3k|	VIPS_FREE(seq->p);
  ------------------
  |  |   50|  12.3k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  12.3k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  12.3k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  12.3k|	{ \
  |  |  |  |   43|  12.3k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 12.3k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  12.3k|			(void) F((S)); \
  |  |  |  |   45|  12.3k|			(S) = 0; \
  |  |  |  |   46|  12.3k|		} \
  |  |  |  |   47|  12.3k|	} \
  |  |  |  |   48|  12.3k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  12.3k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   96|  12.3k|	VIPS_FREE(seq->pixels);
  ------------------
  |  |   50|  12.3k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  12.3k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  12.3k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  12.3k|	{ \
  |  |  |  |   43|  12.3k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 12.3k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  12.3k|			(void) F((S)); \
  |  |  |  |   45|  12.3k|			(S) = 0; \
  |  |  |  |   46|  12.3k|		} \
  |  |  |  |   47|  12.3k|	} \
  |  |  |  |   48|  12.3k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  12.3k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   97|       |
   98|  12.3k|	VIPS_FREE(seq);
  ------------------
  |  |   50|  12.3k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  12.3k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  12.3k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  12.3k|	{ \
  |  |  |  |   43|  12.3k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 12.3k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  12.3k|			(void) F((S)); \
  |  |  |  |   45|  12.3k|			(S) = 0; \
  |  |  |  |   46|  12.3k|		} \
  |  |  |  |   47|  12.3k|	} \
  |  |  |  |   48|  12.3k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  12.3k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   99|       |
  100|  12.3k|	return 0;
  101|  12.3k|}
bandary.c:vips_bandary_init:
  265|  12.4k|{
  266|  12.4k|	bandary->out_bands = -1;
  267|  12.4k|}

bandbool.c:vips_bandbool_class_init:
  216|      1|{
  217|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  218|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  219|      1|	VipsBandaryClass *bandary_class = VIPS_BANDARY_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_BANDARY, VipsBandaryClass))
  ------------------
  220|       |
  221|      1|	gobject_class->set_property = vips_object_set_property;
  222|      1|	gobject_class->get_property = vips_object_get_property;
  223|       |
  224|      1|	object_class->nickname = "bandbool";
  225|      1|	object_class->description = _("boolean operation across image bands");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  226|      1|	object_class->build = vips_bandbool_build;
  227|       |
  228|      1|	bandary_class->process_line = vips_bandbool_buffer;
  229|      1|	bandary_class->format_table = vips_bandbool_format_table;
  230|       |
  231|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  232|      1|		_("Input"),
  233|      1|		_("Input image argument"),
  234|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  235|      1|		G_STRUCT_OFFSET(VipsBandbool, in));
  236|       |
  237|      1|	VIPS_ARG_ENUM(class, "boolean", 200,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  238|      1|		_("Operation"),
  239|      1|		_("Boolean to perform"),
  240|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  241|      1|		G_STRUCT_OFFSET(VipsBandbool, operation),
  242|      1|		VIPS_TYPE_OPERATION_BOOLEAN,
  243|      1|		VIPS_OPERATION_BOOLEAN_AND);
  244|      1|}

bandfold.c:vips_bandfold_class_init:
  144|      1|{
  145|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  146|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  147|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  148|       |
  149|      1|	VIPS_DEBUG_MSG("vips_bandfold_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  150|       |
  151|      1|	gobject_class->set_property = vips_object_set_property;
  152|      1|	gobject_class->get_property = vips_object_get_property;
  153|       |
  154|      1|	vobject_class->nickname = "bandfold";
  155|      1|	vobject_class->description = _("fold up x axis into bands");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  156|      1|	vobject_class->build = vips_bandfold_build;
  157|       |
  158|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  159|       |
  160|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  161|      1|		_("Input"),
  162|      1|		_("Input image"),
  163|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  164|      1|		G_STRUCT_OFFSET(VipsBandfold, in));
  165|       |
  166|      1|	VIPS_ARG_INT(class, "factor", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  167|      1|		_("Factor"),
  168|      1|		_("Fold by this factor"),
  169|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  170|      1|		G_STRUCT_OFFSET(VipsBandfold, factor),
  171|      1|		0, 10000000, 0);
  172|      1|}

vips_bandjoin:
  255|  2.06k|{
  256|  2.06k|	va_list ap;
  257|  2.06k|	int result;
  258|       |
  259|  2.06k|	va_start(ap, n);
  260|  2.06k|	result = vips_bandjoinv(in, out, n, ap);
  261|  2.06k|	va_end(ap);
  262|       |
  263|  2.06k|	return result;
  264|  2.06k|}
vips_bandjoin2:
  279|    460|{
  280|    460|	va_list ap;
  281|    460|	int result;
  282|    460|	VipsImage *in[2];
  283|       |
  284|    460|	in[0] = in1;
  285|    460|	in[1] = in2;
  286|       |
  287|    460|	va_start(ap, out);
  288|    460|	result = vips_bandjoinv(in, out, 2, ap);
  289|    460|	va_end(ap);
  290|       |
  291|    460|	return result;
  292|    460|}
vips_bandjoin_const1:
  510|  8.74k|{
  511|  8.74k|	va_list ap;
  512|  8.74k|	int result;
  513|       |
  514|  8.74k|	va_start(ap, c);
  515|  8.74k|	result = vips_bandjoin_constv(in, out, &c, 1, ap);
  516|  8.74k|	va_end(ap);
  517|       |
  518|  8.74k|	return result;
  519|  8.74k|}
bandjoin.c:vips_bandjoin_class_init:
  184|      1|{
  185|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  186|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  187|      1|	VipsBandaryClass *bandary_class = VIPS_BANDARY_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_BANDARY, VipsBandaryClass))
  ------------------
  188|       |
  189|      1|	VIPS_DEBUG_MSG("vips_bandjoin_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  190|       |
  191|      1|	gobject_class->set_property = vips_object_set_property;
  192|      1|	gobject_class->get_property = vips_object_get_property;
  193|       |
  194|      1|	vobject_class->nickname = "bandjoin";
  195|      1|	vobject_class->description = _("bandwise join a set of images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  196|      1|	vobject_class->build = vips_bandjoin_build;
  197|       |
  198|      1|	bandary_class->process_line = vips_bandjoin_buffer;
  199|       |
  200|      1|	VIPS_ARG_BOXED(class, "in", 0,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  201|      1|		_("Input"),
  202|      1|		_("Array of input images"),
  203|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  204|      1|		G_STRUCT_OFFSET(VipsBandjoin, in),
  205|      1|		VIPS_TYPE_ARRAY_IMAGE);
  206|      1|}
bandjoin.c:vips_bandjoin_build:
  156|  2.52k|{
  157|  2.52k|	VipsBandary *bandary = (VipsBandary *) object;
  158|  2.52k|	VipsBandjoin *bandjoin = (VipsBandjoin *) object;
  159|       |
  160|  2.52k|	if (bandjoin->in) {
  ------------------
  |  Branch (160:6): [True: 2.52k, False: 0]
  ------------------
  161|  2.52k|		bandary->in = vips_array_image_get(bandjoin->in, &bandary->n);
  162|       |
  163|  2.52k|		if (bandary->n == 1)
  ------------------
  |  Branch (163:7): [True: 0, False: 2.52k]
  ------------------
  164|      0|			return vips_bandary_copy(bandary);
  165|  2.52k|		else {
  166|  2.52k|			int i;
  167|       |
  168|  2.52k|			bandary->out_bands = 0;
  169|  9.63k|			for (i = 0; i < bandary->n; i++)
  ------------------
  |  Branch (169:16): [True: 7.10k, False: 2.52k]
  ------------------
  170|  7.10k|				if (bandary->in[i])
  ------------------
  |  Branch (170:9): [True: 7.10k, False: 0]
  ------------------
  171|  7.10k|					bandary->out_bands +=
  172|  7.10k|						bandary->in[i]->Bands;
  173|  2.52k|		}
  174|  2.52k|	}
  175|       |
  176|  2.52k|	if (VIPS_OBJECT_CLASS(vips_bandjoin_parent_class)->build(object))
  ------------------
  |  |  435|  2.52k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.52k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.52k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (176:6): [True: 0, False: 2.52k]
  ------------------
  177|      0|		return -1;
  178|       |
  179|  2.52k|	return 0;
  180|  2.52k|}
bandjoin.c:vips_bandjoin_buffer:
   93|   128k|{
   94|   128k|	VipsBandary *bandary = seq->bandary;
   95|   128k|	VipsConversion *conversion = (VipsConversion *) bandary;
   96|   128k|	VipsImage **in = bandary->ready;
   97|       |
   98|       |	/* Output pel size.
   99|       |	 */
  100|   128k|	const int ops = VIPS_IMAGE_SIZEOF_PEL(conversion->out);
  ------------------
  |  |  384|   128k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   128k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  101|       |
  102|   128k|	int i;
  103|       |
  104|       |	/* Loop for each input image. Scattered write is faster than
  105|       |	 * scattered read.
  106|       |	 */
  107|   499k|	for (i = 0; i < bandary->n; i++) {
  ------------------
  |  Branch (107:14): [True: 371k, False: 128k]
  ------------------
  108|       |		/* Input pel size.
  109|       |		 */
  110|   371k|		int ips = VIPS_IMAGE_SIZEOF_PEL(in[i]);
  ------------------
  |  |  384|   371k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   371k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  111|       |
  112|   371k|		VipsPel *restrict p1;
  113|   371k|		VipsPel *restrict q1;
  114|   371k|		int x, z;
  115|       |
  116|   371k|		q1 = q;
  117|   371k|		p1 = p[i];
  118|       |
  119|   371k|		if (ips == 1) {
  ------------------
  |  Branch (119:7): [True: 294k, False: 76.9k]
  ------------------
  120|  23.1M|			for (x = 0; x < width; x++) {
  ------------------
  |  Branch (120:16): [True: 22.8M, False: 294k]
  ------------------
  121|  22.8M|				q1[0] = p1[x];
  122|       |
  123|  22.8M|				q1 += ops;
  124|  22.8M|			}
  125|       |
  126|   294k|			q += ips;
  127|   294k|		}
  128|  76.9k|		else if (ips == 3) {
  ------------------
  |  Branch (128:12): [True: 3.69k, False: 73.2k]
  ------------------
  129|   186k|			for (x = 0; x < width; x++) {
  ------------------
  |  Branch (129:16): [True: 182k, False: 3.69k]
  ------------------
  130|   182k|				q1[0] = p1[0];
  131|   182k|				q1[1] = p1[1];
  132|   182k|				q1[2] = p1[2];
  133|       |
  134|   182k|				p1 += ips;
  135|   182k|				q1 += ops;
  136|   182k|			}
  137|       |
  138|  3.69k|			q += ips;
  139|  3.69k|		}
  140|  73.2k|		else {
  141|  2.54M|			for (x = 0; x < width; x++) {
  ------------------
  |  Branch (141:16): [True: 2.47M, False: 73.2k]
  ------------------
  142|  13.5M|				for (z = 0; z < ips; z++)
  ------------------
  |  Branch (142:17): [True: 11.0M, False: 2.47M]
  ------------------
  143|  11.0M|					q1[z] = p1[z];
  144|       |
  145|  2.47M|				p1 += ips;
  146|  2.47M|				q1 += ops;
  147|  2.47M|			}
  148|       |
  149|  73.2k|			q += ips;
  150|  73.2k|		}
  151|   371k|	}
  152|   128k|}
bandjoin.c:vips_bandjoin_init:
  210|  2.52k|{
  211|       |	/* Init our instance fields.
  212|       |	 */
  213|  2.52k|}
bandjoin.c:vips_bandjoinv:
  217|  2.52k|{
  218|  2.52k|	VipsArrayImage *array;
  219|  2.52k|	int result;
  220|       |
  221|  2.52k|	array = vips_array_image_new(in, n);
  222|  2.52k|	result = vips_call_split("bandjoin", ap, array, out);
  223|  2.52k|	vips_area_unref(VIPS_AREA(array));
  ------------------
  |  |  137|  2.52k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  224|       |
  225|  2.52k|	return result;
  226|  2.52k|}
bandjoin.c:vips_bandjoin_const_class_init:
  418|      1|{
  419|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  420|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  421|      1|	VipsBandaryClass *bandary_class = VIPS_BANDARY_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_BANDARY, VipsBandaryClass))
  ------------------
  422|       |
  423|      1|	VIPS_DEBUG_MSG("vips_bandjoin_const_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  424|       |
  425|      1|	gobject_class->finalize = vips_bandjoin_const_finalize;
  426|      1|	gobject_class->set_property = vips_object_set_property;
  427|      1|	gobject_class->get_property = vips_object_get_property;
  428|       |
  429|      1|	vobject_class->nickname = "bandjoin_const";
  430|      1|	vobject_class->description = _("append a constant band to an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  431|      1|	vobject_class->build = vips_bandjoin_const_build;
  432|       |
  433|      1|	bandary_class->process_line = vips_bandjoin_const_buffer;
  434|       |
  435|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  436|      1|		_("Input"),
  437|      1|		_("Input image"),
  438|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  439|      1|		G_STRUCT_OFFSET(VipsBandjoinConst, in));
  440|       |
  441|      1|	VIPS_ARG_BOXED(class, "c", 12,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  442|      1|		_("Constants"),
  443|      1|		_("Array of constants to add"),
  444|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  445|      1|		G_STRUCT_OFFSET(VipsBandjoinConst, c),
  446|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  447|      1|}
bandjoin.c:vips_bandjoin_const_finalize:
  314|  8.73k|{
  315|  8.73k|	VipsBandjoinConst *bandjoin = (VipsBandjoinConst *) object;
  316|       |
  317|  8.73k|	VIPS_FREE(bandjoin->c_ready);
  ------------------
  |  |   50|  8.73k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  8.73k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  8.73k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  8.73k|	{ \
  |  |  |  |   43|  8.73k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 8.73k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  8.73k|			(void) F((S)); \
  |  |  |  |   45|  8.73k|			(S) = 0; \
  |  |  |  |   46|  8.73k|		} \
  |  |  |  |   47|  8.73k|	} \
  |  |  |  |   48|  8.73k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  8.73k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  318|       |
  319|  8.73k|	G_OBJECT_CLASS(vips_bandjoin_const_parent_class)->finalize(object);
  ------------------
  |  |   58|  8.73k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  8.73k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  8.73k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  320|  8.73k|}
bandjoin.c:vips_bandjoin_const_build:
  384|  8.74k|{
  385|  8.74k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  8.74k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  8.74k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  8.74k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  386|  8.74k|	VipsBandary *bandary = (VipsBandary *) object;
  387|  8.74k|	VipsBandjoinConst *bandjoin = (VipsBandjoinConst *) object;
  388|       |
  389|  8.74k|	if (bandjoin->c &&
  ------------------
  |  Branch (389:6): [True: 8.74k, False: 0]
  ------------------
  390|  8.74k|		bandjoin->in) {
  ------------------
  |  Branch (390:3): [True: 8.74k, False: 0]
  ------------------
  391|  8.74k|		double *c;
  392|  8.74k|		int n;
  393|       |
  394|  8.74k|		c = vips_array_double_get(bandjoin->c, &n);
  395|       |
  396|  8.74k|		if (n == 0)
  ------------------
  |  Branch (396:7): [True: 0, False: 8.74k]
  ------------------
  397|      0|			return vips_bandary_copy(bandary);
  398|  8.74k|		else
  399|  8.74k|			bandary->out_bands = bandjoin->in->Bands + n;
  400|       |
  401|  8.74k|		bandary->n = 1;
  402|  8.74k|		bandary->in = &bandjoin->in;
  403|       |
  404|  8.74k|		if (!(bandjoin->c_ready = vips__vector_to_pels(class->nickname,
  ------------------
  |  Branch (404:7): [True: 0, False: 8.74k]
  ------------------
  405|  8.74k|				  n, bandjoin->in->BandFmt, bandjoin->in->Coding,
  406|  8.74k|				  c, NULL, n)))
  407|      0|			return -1;
  408|  8.74k|	}
  409|       |
  410|  8.74k|	if (VIPS_OBJECT_CLASS(vips_bandjoin_const_parent_class)->build(object))
  ------------------
  |  |  435|  8.74k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  8.74k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  8.74k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (410:6): [True: 0, False: 8.74k]
  ------------------
  411|      0|		return -1;
  412|       |
  413|  8.74k|	return 0;
  414|  8.74k|}
bandjoin.c:vips_bandjoin_const_buffer:
  325|   211k|{
  326|   211k|	VipsBandary *bandary = seq->bandary;
  327|   211k|	VipsConversion *conversion = (VipsConversion *) bandary;
  328|   211k|	VipsBandjoinConst *bandjoin = (VipsBandjoinConst *) bandary;
  329|   211k|	VipsImage *in = bandary->ready[0];
  330|       |
  331|       |	/* Output pel size.
  332|       |	 */
  333|   211k|	const int ops = VIPS_IMAGE_SIZEOF_PEL(conversion->out);
  ------------------
  |  |  384|   211k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   211k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  334|       |
  335|       |	/* Input pel size.
  336|       |	 */
  337|   211k|	const int ips = VIPS_IMAGE_SIZEOF_PEL(in);
  ------------------
  |  |  384|   211k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   211k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  338|       |
  339|       |	/* Extra bands size.
  340|       |	 */
  341|   211k|	const int ebs = ops - ips;
  342|       |
  343|   211k|	VipsPel *restrict p1;
  344|   211k|	VipsPel *restrict q1;
  345|   211k|	int x, z;
  346|       |
  347|   211k|	q1 = q;
  348|   211k|	p1 = p[0];
  349|       |
  350|       |	/* Special path for 8-bit RGB -> RGBA ... it's a common case.
  351|       |	 */
  352|   211k|	if (ips == 3 &&
  ------------------
  |  Branch (352:6): [True: 206k, False: 4.09k]
  ------------------
  353|   211k|		ebs == 1) {
  ------------------
  |  Branch (353:3): [True: 206k, False: 0]
  ------------------
  354|   206k|		int c = bandjoin->c_ready[0];
  355|       |
  356|  15.2M|		for (x = 0; x < width; x++) {
  ------------------
  |  Branch (356:15): [True: 15.0M, False: 206k]
  ------------------
  357|  15.0M|			q1[0] = p1[0];
  358|  15.0M|			q1[1] = p1[1];
  359|  15.0M|			q1[2] = p1[2];
  360|  15.0M|			q1[3] = c;
  361|       |
  362|  15.0M|			p1 += 3;
  363|  15.0M|			q1 += 4;
  364|  15.0M|		}
  365|   206k|	}
  366|  4.09k|	else {
  367|   151k|		for (x = 0; x < width; x++) {
  ------------------
  |  Branch (367:15): [True: 147k, False: 4.09k]
  ------------------
  368|   735k|			for (z = 0; z < ips; z++)
  ------------------
  |  Branch (368:16): [True: 588k, False: 147k]
  ------------------
  369|   588k|				q1[z] = p1[z];
  370|       |
  371|   147k|			p1 += ips;
  372|   147k|			q1 += ips;
  373|       |
  374|   294k|			for (z = 0; z < ebs; z++)
  ------------------
  |  Branch (374:16): [True: 147k, False: 147k]
  ------------------
  375|   147k|				q1[z] = bandjoin->c_ready[z];
  376|       |
  377|   147k|			q1 += ebs;
  378|   147k|		}
  379|  4.09k|	}
  380|   211k|}
bandjoin.c:vips_bandjoin_const_init:
  451|  8.74k|{
  452|       |	/* Init our instance fields.
  453|       |	 */
  454|  8.74k|}
bandjoin.c:vips_bandjoin_constv:
  459|  8.74k|{
  460|  8.74k|	VipsArrayDouble *array;
  461|  8.74k|	int result;
  462|       |
  463|  8.74k|	array = vips_array_double_new(c, n);
  464|  8.74k|	result = vips_call_split("bandjoin_const", ap, in, out, array);
  465|  8.74k|	vips_area_unref(VIPS_AREA(array));
  ------------------
  |  |  137|  8.74k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  466|       |
  467|  8.74k|	return result;
  468|  8.74k|}

bandmean.c:vips_bandmean_class_init:
  197|      1|{
  198|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  199|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  200|      1|	VipsBandaryClass *bandary_class = VIPS_BANDARY_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_BANDARY, VipsBandaryClass))
  ------------------
  201|       |
  202|      1|	gobject_class->set_property = vips_object_set_property;
  203|      1|	gobject_class->get_property = vips_object_get_property;
  204|       |
  205|      1|	object_class->nickname = "bandmean";
  206|      1|	object_class->description = _("band-wise average");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  207|      1|	object_class->build = vips_bandmean_build;
  208|       |
  209|      1|	bandary_class->process_line = vips_bandmean_buffer;
  210|       |
  211|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  212|      1|		_("Input"),
  213|      1|		_("Input image argument"),
  214|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  215|      1|		G_STRUCT_OFFSET(VipsBandmean, in));
  216|      1|}

bandrank.c:vips_bandrank_class_init:
  237|      1|{
  238|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  239|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  240|      1|	VipsBandaryClass *bandary_class = VIPS_BANDARY_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_BANDARY, VipsBandaryClass))
  ------------------
  241|       |
  242|      1|	VIPS_DEBUG_MSG("vips_bandrank_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  243|       |
  244|      1|	gobject_class->set_property = vips_object_set_property;
  245|      1|	gobject_class->get_property = vips_object_get_property;
  246|       |
  247|      1|	vobject_class->nickname = "bandrank";
  248|      1|	vobject_class->description = _("band-wise rank of a set of images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  249|      1|	vobject_class->build = vips_bandrank_build;
  250|       |
  251|      1|	bandary_class->process_line = vips_bandrank_buffer;
  252|       |
  253|      1|	VIPS_ARG_BOXED(class, "in", 0,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  254|      1|		_("Input"),
  255|      1|		_("Array of input images"),
  256|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  257|      1|		G_STRUCT_OFFSET(VipsBandrank, in),
  258|      1|		VIPS_TYPE_ARRAY_IMAGE);
  259|       |
  260|      1|	VIPS_ARG_INT(class, "index", 0,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  261|      1|		_("Index"),
  262|      1|		_("Select this band element from sorted list"),
  263|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  264|      1|		G_STRUCT_OFFSET(VipsBandrank, index),
  265|      1|		-1, 1000000, -1);
  266|      1|}

bandunfold.c:vips_bandunfold_class_init:
  147|      1|{
  148|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  149|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  150|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  151|       |
  152|      1|	VIPS_DEBUG_MSG("vips_bandunfold_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  153|       |
  154|      1|	gobject_class->set_property = vips_object_set_property;
  155|      1|	gobject_class->get_property = vips_object_get_property;
  156|       |
  157|      1|	vobject_class->nickname = "bandunfold";
  158|      1|	vobject_class->description = _("unfold image bands into x axis");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  159|      1|	vobject_class->build = vips_bandunfold_build;
  160|       |
  161|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  162|       |
  163|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  164|      1|		_("Input"),
  165|      1|		_("Input image"),
  166|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  167|      1|		G_STRUCT_OFFSET(VipsBandunfold, in));
  168|       |
  169|      1|	VIPS_ARG_INT(class, "factor", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  170|      1|		_("Factor"),
  171|      1|		_("Unfold by this factor"),
  172|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  173|      1|		G_STRUCT_OFFSET(VipsBandunfold, factor),
  174|      1|		0, 10000000, 0);
  175|      1|}

byteswap.c:vips_byteswap_class_init:
  221|      1|{
  222|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  224|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  225|       |
  226|      1|	VIPS_DEBUG_MSG("vips_byteswap_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  227|       |
  228|      1|	gobject_class->set_property = vips_object_set_property;
  229|      1|	gobject_class->get_property = vips_object_get_property;
  230|       |
  231|      1|	vobject_class->nickname = "byteswap";
  232|      1|	vobject_class->description = _("byteswap an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  233|      1|	vobject_class->build = vips_byteswap_build;
  234|       |
  235|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  236|       |
  237|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  238|      1|		_("Input"),
  239|      1|		_("Input image"),
  240|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  241|      1|		G_STRUCT_OFFSET(VipsByteswap, in));
  242|      1|}

cache.c:vips_cache_class_init:
   87|      1|{
   88|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   89|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   90|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
   91|       |
   92|      1|	VIPS_DEBUG_MSG("vips_cache_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   93|       |
   94|      1|	gobject_class->set_property = vips_object_set_property;
   95|      1|	gobject_class->get_property = vips_object_get_property;
   96|       |
   97|      1|	vobject_class->nickname = "cache";
   98|      1|	vobject_class->description = _("cache an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   99|      1|	vobject_class->build = vips_cache_build;
  100|       |
  101|       |	/* sinkscreen swallows errors (you don't want to see them when you display
  102|       |	 * images), making this operation worse than useless for batch processing.
  103|       |	 * Just use tilecache() instead.
  104|       |	 */
  105|      1|	operation_class->flags |= VIPS_OPERATION_DEPRECATED;
  106|       |
  107|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  108|      1|		_("Input"),
  109|      1|		_("Input image"),
  110|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  111|      1|		G_STRUCT_OFFSET(VipsCache, in));
  112|       |
  113|      1|	VIPS_ARG_INT(class, "tile_width", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  114|      1|		_("Tile width"),
  115|      1|		_("Tile width in pixels"),
  116|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  117|      1|		G_STRUCT_OFFSET(VipsCache, tile_width),
  118|      1|		1, 1000000, 128);
  119|       |
  120|      1|	VIPS_ARG_INT(class, "tile_height", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  121|      1|		_("Tile height"),
  122|      1|		_("Tile height in pixels"),
  123|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  124|      1|		G_STRUCT_OFFSET(VipsCache, tile_height),
  125|      1|		1, 1000000, 128);
  126|       |
  127|      1|	VIPS_ARG_INT(class, "max_tiles", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  128|      1|		_("Max tiles"),
  129|      1|		_("Maximum number of tiles to cache"),
  130|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  131|      1|		G_STRUCT_OFFSET(VipsCache, max_tiles),
  132|      1|		-1, 1000000, 250);
  133|      1|}

vips_cast:
  589|  21.5k|{
  590|  21.5k|	va_list ap;
  591|  21.5k|	int result;
  592|       |
  593|  21.5k|	va_start(ap, format);
  594|  21.5k|	result = vips_castv(in, out, format, ap);
  595|  21.5k|	va_end(ap);
  596|       |
  597|  21.5k|	return result;
  598|  21.5k|}
vips_cast_float:
  750|  1.52k|{
  751|  1.52k|	va_list ap;
  752|  1.52k|	int result;
  753|       |
  754|  1.52k|	va_start(ap, out);
  755|  1.52k|	result = vips_castv(in, out, VIPS_FORMAT_FLOAT, ap);
  756|  1.52k|	va_end(ap);
  757|       |
  758|  1.52k|	return result;
  759|  1.52k|}
cast.c:vips_cast_class_init:
  513|      1|{
  514|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  515|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  516|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  517|       |
  518|      1|	VIPS_DEBUG_MSG("vips_cast_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  519|       |
  520|      1|	gobject_class->set_property = vips_object_set_property;
  521|      1|	gobject_class->get_property = vips_object_get_property;
  522|       |
  523|      1|	vobject_class->nickname = "cast";
  524|      1|	vobject_class->description = _("cast an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  525|      1|	vobject_class->build = vips_cast_build;
  526|       |
  527|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  528|       |
  529|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  530|      1|		_("Input"),
  531|      1|		_("Input image"),
  532|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  533|      1|		G_STRUCT_OFFSET(VipsCast, in));
  534|       |
  535|      1|	VIPS_ARG_ENUM(class, "format", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  536|      1|		_("Format"),
  537|      1|		_("Format to cast to"),
  538|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  539|      1|		G_STRUCT_OFFSET(VipsCast, format),
  540|      1|		VIPS_TYPE_BAND_FORMAT, VIPS_FORMAT_UCHAR);
  541|       |
  542|      1|	VIPS_ARG_BOOL(class, "shift", 7,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  543|      1|		_("Shift"),
  544|      1|		_("Shift integer values up and down"),
  545|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  546|      1|		G_STRUCT_OFFSET(VipsCast, shift),
  547|      1|		FALSE);
  548|      1|}
cast.c:vips_cast_build:
  461|  23.0k|{
  462|  23.0k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  23.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  23.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  23.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  23.0k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  463|  23.0k|	VipsCast *cast = (VipsCast *) object;
  464|  23.0k|	VipsImage **t = (VipsImage **)
  465|  23.0k|		vips_object_local_array(object, 2);
  466|       |
  467|  23.0k|	VipsImage *in;
  468|       |
  469|  23.0k|	if (VIPS_OBJECT_CLASS(vips_cast_parent_class)->build(object))
  ------------------
  |  |  435|  23.0k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  23.0k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  23.0k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (469:6): [True: 0, False: 23.0k]
  ------------------
  470|      0|		return -1;
  471|       |
  472|  23.0k|	in = cast->in;
  473|       |
  474|       |	/* Trivial case: fall back to copy().
  475|       |	 */
  476|  23.0k|	if (in->BandFmt == cast->format)
  ------------------
  |  Branch (476:6): [True: 12.5k, False: 10.5k]
  ------------------
  477|  12.5k|		return vips_image_write(in, conversion->out);
  478|       |
  479|  10.5k|	if (vips_image_decode(in, &t[0]))
  ------------------
  |  Branch (479:6): [True: 0, False: 10.5k]
  ------------------
  480|      0|		return -1;
  481|  10.5k|	in = t[0];
  482|       |
  483|       |	/* If @shift is on but we're not in an int format and we're going to
  484|       |	 * an int format, we need to cast to int first. For example, what
  485|       |	 * about a float image tagged as rgb16 being cast to uint8? We need
  486|       |	 * to cast to ushort before we do the final cast to uint8.
  487|       |	 */
  488|  10.5k|	if (cast->shift &&
  ------------------
  |  Branch (488:6): [True: 299, False: 10.2k]
  ------------------
  489|  10.5k|		!vips_band_format_isint(in->BandFmt) &&
  ------------------
  |  Branch (489:3): [True: 39, False: 260]
  ------------------
  490|  10.5k|		vips_band_format_isint(cast->format)) {
  ------------------
  |  Branch (490:3): [True: 39, False: 0]
  ------------------
  491|     39|		if (vips_cast(in, &t[1],
  ------------------
  |  Branch (491:7): [True: 0, False: 39]
  ------------------
  492|     39|				vips_image_guess_format(in), NULL))
  493|      0|			return -1;
  494|     39|		in = t[1];
  495|     39|	}
  496|       |
  497|  10.5k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (497:6): [True: 0, False: 10.5k]
  ------------------
  498|  10.5k|			VIPS_DEMAND_STYLE_THINSTRIP, in, NULL))
  499|      0|		return -1;
  500|       |
  501|  10.5k|	conversion->out->BandFmt = cast->format;
  502|       |
  503|  10.5k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (503:6): [True: 0, False: 10.5k]
  ------------------
  504|  10.5k|			vips_start_one, vips_cast_gen, vips_stop_one,
  505|  10.5k|			in, cast))
  506|      0|		return -1;
  507|       |
  508|  10.5k|	return 0;
  509|  10.5k|}
cast.c:vips_cast_gen:
  360|  13.1k|{
  361|  13.1k|	VipsRegion *ir = (VipsRegion *) vseq;
  362|  13.1k|	VipsCast *cast = (VipsCast *) b;
  363|  13.1k|	VipsConversion *conversion = (VipsConversion *) b;
  364|  13.1k|	VipsRect *r = &out_region->valid;
  365|  13.1k|	int sz = VIPS_REGION_N_ELEMENTS(out_region);
  ------------------
  |  |  197|  13.1k|	((size_t) ((R)->valid.width * (R)->im->Bands))
  ------------------
  366|       |
  367|  13.1k|	int x, y;
  368|       |
  369|  13.1k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (369:6): [True: 480, False: 12.6k]
  ------------------
  370|    480|		return -1;
  371|       |
  372|  13.1k|	VIPS_GATE_START("vips_cast_gen: work");
  ------------------
  |  |   41|  12.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  12.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  12.6k|	{ \
  |  |   43|  12.6k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 12.6k]
  |  |  ------------------
  |  |   44|  12.6k|			vips__thread_gate_start(NAME); \
  |  |   45|  12.6k|	} \
  |  |   46|  13.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  13.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  373|       |
  374|  75.6k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (374:14): [True: 63.0k, False: 12.6k]
  ------------------
  375|  63.0k|		VipsPel *in = VIPS_REGION_ADDR(ir, r->left, r->top + y);
  ------------------
  |  |  227|  63.0k|	((R)->data + \
  |  |  228|  63.0k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  63.0k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  63.0k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  63.0k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  63.0k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  63.0k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  376|  63.0k|		VipsPel *out = VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|  63.0k|	((R)->data + \
  |  |  228|  63.0k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  63.0k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  63.0k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  63.0k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  63.0k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  63.0k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  377|       |
  378|  63.0k|		switch (ir->im->BandFmt) {
  379|      0|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (379:3): [True: 0, False: 63.0k]
  ------------------
  380|      0|			BAND_SWITCH_INNER(unsigned char,
  ------------------
  |  |  310|      0|	{ \
  |  |  311|      0|		switch (conversion->out->BandFmt) { \
  |  |  312|      0|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  313|      0|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  381|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|      0|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|      0|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|      0|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  381|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  124|      0|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|      0|			break; \
  |  |  319|      0|\
  |  |  320|      0|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  381|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  125|      0|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|      0|			break; \
  |  |  323|      0|\
  |  |  324|      0|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  381|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  126|      0|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|      0|			break; \
  |  |  327|      0|\
  |  |  328|      0|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  381|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  130|      0|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|      0|			break; \
  |  |  331|      0|\
  |  |  332|      0|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  381|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  131|      0|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|      0|			break; \
  |  |  335|      0|\
  |  |  336|      0|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  337|      0|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  382|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|      0|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  341|      0|			FLOAT(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  382|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|			break; \
  |  |  343|      0|\
  |  |  344|      0|		case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (344:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  345|      0|			COMPLEX(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  383|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|      0|			break; \
  |  |  347|      0|\
  |  |  348|      0|		case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (348:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  349|      0|			COMPLEX(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  383|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  350|      0|			break; \
  |  |  351|      0|\
  |  |  352|      0|		default: \
  |  |  ------------------
  |  |  |  Branch (352:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  353|      0|			g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  354|      0|		} \
  |  |  355|      0|	}
  ------------------
  381|      0|				INT_INT,
  382|      0|				CAST_REAL_FLOAT,
  383|      0|				CAST_REAL_COMPLEX);
  384|      0|			break;
  385|       |
  386|  2.76k|		case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (386:3): [True: 2.76k, False: 60.2k]
  ------------------
  387|  2.76k|			BAND_SWITCH_INNER(signed char,
  ------------------
  |  |  310|  2.76k|	{ \
  |  |  311|  2.76k|		switch (conversion->out->BandFmt) { \
  |  |  312|  2.76k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 2.76k, False: 0]
  |  |  ------------------
  |  |  313|  2.76k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  388|  2.76k|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|  2.76k|	{ \
  |  |  |  |  |  |  214|  2.76k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 2.76k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|  2.76k|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|  2.76k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 2.76k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|  2.76k|		else { \
  |  |  |  |  |  |  222|  2.76k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  2.76k|	{ \
  |  |  |  |  |  |  |  |  184|  2.76k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  2.76k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  2.76k|\
  |  |  |  |  |  |  |  |  187|   457k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 454k, False: 2.76k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   454k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   454k|\
  |  |  |  |  |  |  |  |  190|   454k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|   454k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|   454k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   454k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   909k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 21.9k, False: 432k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 454k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 432k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   454k|		} \
  |  |  |  |  |  |  |  |  192|  2.76k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  2.76k|		} \
  |  |  |  |  |  |  224|  2.76k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  2.76k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 2.76k]
  |  |  ------------------
  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  388|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  124|      0|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|      0|			break; \
  |  |  319|      0|\
  |  |  320|      0|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 0, False: 2.76k]
  |  |  ------------------
  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  388|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  125|      0|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|      0|			break; \
  |  |  323|      0|\
  |  |  324|      0|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 0, False: 2.76k]
  |  |  ------------------
  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  388|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  126|      0|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|      0|			break; \
  |  |  327|      0|\
  |  |  328|      0|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 0, False: 2.76k]
  |  |  ------------------
  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  388|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  130|      0|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|      0|			break; \
  |  |  331|      0|\
  |  |  332|      0|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 0, False: 2.76k]
  |  |  ------------------
  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  388|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  131|      0|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|      0|			break; \
  |  |  335|      0|\
  |  |  336|      0|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 0, False: 2.76k]
  |  |  ------------------
  |  |  337|      0|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  389|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|      0|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 2.76k]
  |  |  ------------------
  |  |  341|      0|			FLOAT(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  389|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|			break; \
  |  |  343|      0|\
  |  |  344|      0|		case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (344:3): [True: 0, False: 2.76k]
  |  |  ------------------
  |  |  345|      0|			COMPLEX(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  390|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|      0|			break; \
  |  |  347|      0|\
  |  |  348|      0|		case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (348:3): [True: 0, False: 2.76k]
  |  |  ------------------
  |  |  349|      0|			COMPLEX(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  390|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  350|      0|			break; \
  |  |  351|      0|\
  |  |  352|      0|		default: \
  |  |  ------------------
  |  |  |  Branch (352:3): [True: 0, False: 2.76k]
  |  |  ------------------
  |  |  353|      0|			g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  354|  2.76k|		} \
  |  |  355|  2.76k|	}
  ------------------
  388|  2.76k|				INT_INT_SIGNED,
  389|  2.76k|				CAST_REAL_FLOAT,
  390|  2.76k|				CAST_REAL_COMPLEX);
  391|  2.76k|			break;
  392|       |
  393|  13.2k|		case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (393:3): [True: 13.2k, False: 49.7k]
  ------------------
  394|  13.2k|			BAND_SWITCH_INNER(unsigned short,
  ------------------
  |  |  310|  13.2k|	{ \
  |  |  311|  13.2k|		switch (conversion->out->BandFmt) { \
  |  |  312|  13.2k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 13.2k, False: 0]
  |  |  ------------------
  |  |  313|  13.2k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  395|  13.2k|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|  13.2k|	{ \
  |  |  |  |  |  |  198|  13.2k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 7.10k, False: 6.13k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|  13.2k|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|  7.10k|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|  7.10k|	{ \
  |  |  |  |  |  |  |  |  140|  7.10k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|  7.10k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|  7.10k|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|  7.10k|\
  |  |  |  |  |  |  |  |  144|  7.10k|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|  7.10k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|  7.10k|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|  7.10k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|  7.10k|\
  |  |  |  |  |  |  |  |  146|   789k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 782k, False: 7.10k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|   782k|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|  7.10k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|  7.10k|		} \
  |  |  |  |  |  |  202|  13.2k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 6.13k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|  6.13k|		else { \
  |  |  |  |  |  |  206|  6.13k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  6.13k|	{ \
  |  |  |  |  |  |  |  |  184|  6.13k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  6.13k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  6.13k|\
  |  |  |  |  |  |  |  |  187|  1.31M|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 1.30M, False: 6.13k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|  1.30M|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|  1.30M|\
  |  |  |  |  |  |  |  |  190|  1.30M|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|  1.30M|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|  1.30M|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|  1.30M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  2.61M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 1.30M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 1.30M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 1.30M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|  1.30M|		} \
  |  |  |  |  |  |  |  |  192|  6.13k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|  6.13k|		} \
  |  |  |  |  |  |  208|  13.2k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  13.2k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 13.2k]
  |  |  ------------------
  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  395|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  124|      0|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|      0|			break; \
  |  |  319|      0|\
  |  |  320|      0|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 0, False: 13.2k]
  |  |  ------------------
  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  395|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  125|      0|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|      0|			break; \
  |  |  323|      0|\
  |  |  324|      0|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 0, False: 13.2k]
  |  |  ------------------
  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  395|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  126|      0|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|      0|			break; \
  |  |  327|      0|\
  |  |  328|      0|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 0, False: 13.2k]
  |  |  ------------------
  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  395|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  130|      0|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|      0|			break; \
  |  |  331|      0|\
  |  |  332|      0|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 0, False: 13.2k]
  |  |  ------------------
  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  395|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  131|      0|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|      0|			break; \
  |  |  335|      0|\
  |  |  336|      0|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 0, False: 13.2k]
  |  |  ------------------
  |  |  337|      0|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  396|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|      0|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 13.2k]
  |  |  ------------------
  |  |  341|      0|			FLOAT(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  396|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|			break; \
  |  |  343|      0|\
  |  |  344|      0|		case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (344:3): [True: 0, False: 13.2k]
  |  |  ------------------
  |  |  345|      0|			COMPLEX(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  397|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|      0|			break; \
  |  |  347|      0|\
  |  |  348|      0|		case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (348:3): [True: 0, False: 13.2k]
  |  |  ------------------
  |  |  349|      0|			COMPLEX(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  397|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  350|      0|			break; \
  |  |  351|      0|\
  |  |  352|      0|		default: \
  |  |  ------------------
  |  |  |  Branch (352:3): [True: 0, False: 13.2k]
  |  |  ------------------
  |  |  353|      0|			g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  354|  13.2k|		} \
  |  |  355|  13.2k|	}
  ------------------
  395|  13.2k|				INT_INT,
  396|  13.2k|				CAST_REAL_FLOAT,
  397|  13.2k|				CAST_REAL_COMPLEX);
  398|  13.2k|			break;
  399|       |
  400|  2.65k|		case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (400:3): [True: 2.65k, False: 60.3k]
  ------------------
  401|  2.65k|			BAND_SWITCH_INNER(signed short,
  ------------------
  |  |  310|  2.65k|	{ \
  |  |  311|  2.65k|		switch (conversion->out->BandFmt) { \
  |  |  312|  1.25k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 1.25k, False: 1.40k]
  |  |  ------------------
  |  |  313|  1.25k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  402|  1.25k|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|  1.25k|	{ \
  |  |  |  |  |  |  214|  1.25k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 169, False: 1.08k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|  1.25k|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|    169|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|    169|	{ \
  |  |  |  |  |  |  |  |  140|    169|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|    169|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|    169|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|    169|\
  |  |  |  |  |  |  |  |  144|    169|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|    169|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|    169|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|    169|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|    169|\
  |  |  |  |  |  |  |  |  146|  58.5k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 58.3k, False: 169]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|  58.3k|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|    169|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|    169|		} \
  |  |  |  |  |  |  218|  1.25k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 1.08k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|  1.08k|		else { \
  |  |  |  |  |  |  222|  1.08k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  1.08k|	{ \
  |  |  |  |  |  |  |  |  184|  1.08k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  1.08k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  1.08k|\
  |  |  |  |  |  |  |  |  187|   103k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 102k, False: 1.08k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   102k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   102k|\
  |  |  |  |  |  |  |  |  190|   102k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|   102k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|   102k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   102k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   205k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 5.76k, False: 97.0k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 2.52k, False: 100k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 2.52k, False: 94.5k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   102k|		} \
  |  |  |  |  |  |  |  |  192|  1.08k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  1.08k|		} \
  |  |  |  |  |  |  224|  1.25k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  1.25k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 2.65k]
  |  |  ------------------
  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  402|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  124|      0|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|      0|			break; \
  |  |  319|      0|\
  |  |  320|      0|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 0, False: 2.65k]
  |  |  ------------------
  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  402|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  125|      0|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|      0|			break; \
  |  |  323|      0|\
  |  |  324|      0|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 0, False: 2.65k]
  |  |  ------------------
  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  402|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  126|      0|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|      0|			break; \
  |  |  327|      0|\
  |  |  328|      0|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 0, False: 2.65k]
  |  |  ------------------
  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  402|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  130|      0|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|      0|			break; \
  |  |  331|      0|\
  |  |  332|      0|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 0, False: 2.65k]
  |  |  ------------------
  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  402|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  131|      0|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|      0|			break; \
  |  |  335|      0|\
  |  |  336|  1.40k|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 1.40k, False: 1.25k]
  |  |  ------------------
  |  |  337|  1.40k|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  403|  1.40k|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|  1.40k|	{ \
  |  |  |  |  |  |  260|  1.40k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|  1.40k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|  1.40k|\
  |  |  |  |  |  |  263|  47.7k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 46.3k, False: 1.40k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|  46.3k|			q[x] = p[x]; \
  |  |  |  |  |  |  265|  1.40k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|  1.40k|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 2.65k]
  |  |  ------------------
  |  |  341|      0|			FLOAT(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  403|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|			break; \
  |  |  343|      0|\
  |  |  344|      0|		case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (344:3): [True: 0, False: 2.65k]
  |  |  ------------------
  |  |  345|      0|			COMPLEX(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  404|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|      0|			break; \
  |  |  347|      0|\
  |  |  348|      0|		case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (348:3): [True: 0, False: 2.65k]
  |  |  ------------------
  |  |  349|      0|			COMPLEX(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  404|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  350|      0|			break; \
  |  |  351|      0|\
  |  |  352|      0|		default: \
  |  |  ------------------
  |  |  |  Branch (352:3): [True: 0, False: 2.65k]
  |  |  ------------------
  |  |  353|      0|			g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  354|  2.65k|		} \
  |  |  355|  2.65k|	}
  ------------------
  402|  2.65k|				INT_INT_SIGNED,
  403|  2.65k|				CAST_REAL_FLOAT,
  404|  2.65k|				CAST_REAL_COMPLEX);
  405|  2.65k|			break;
  406|       |
  407|  8.24k|		case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (407:3): [True: 8.24k, False: 54.7k]
  ------------------
  408|  8.24k|			BAND_SWITCH_INNER(unsigned int,
  ------------------
  |  |  310|  8.24k|	{ \
  |  |  311|  8.24k|		switch (conversion->out->BandFmt) { \
  |  |  312|  8.19k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 8.19k, False: 41]
  |  |  ------------------
  |  |  313|  8.19k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  409|  8.19k|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|  8.19k|	{ \
  |  |  |  |  |  |  198|  8.19k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 8.19k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|  8.19k|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|  8.19k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 8.19k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|  8.19k|		else { \
  |  |  |  |  |  |  206|  8.19k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  8.19k|	{ \
  |  |  |  |  |  |  |  |  184|  8.19k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  8.19k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  8.19k|\
  |  |  |  |  |  |  |  |  187|   855k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 847k, False: 8.19k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   847k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   847k|\
  |  |  |  |  |  |  |  |  190|   847k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|   847k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|   847k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   847k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  1.69M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 57.4k, False: 790k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 29.5k, False: 818k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 29.5k, False: 760k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   847k|		} \
  |  |  |  |  |  |  |  |  192|  8.19k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|  8.19k|		} \
  |  |  |  |  |  |  208|  8.19k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  8.19k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 8.24k]
  |  |  ------------------
  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  409|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  124|      0|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|      0|			break; \
  |  |  319|      0|\
  |  |  320|      0|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 0, False: 8.24k]
  |  |  ------------------
  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  409|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  125|      0|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|      0|			break; \
  |  |  323|      0|\
  |  |  324|      0|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 0, False: 8.24k]
  |  |  ------------------
  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  409|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  126|      0|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|      0|			break; \
  |  |  327|      0|\
  |  |  328|      0|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 0, False: 8.24k]
  |  |  ------------------
  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  409|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  130|      0|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|      0|			break; \
  |  |  331|      0|\
  |  |  332|      0|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 0, False: 8.24k]
  |  |  ------------------
  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  409|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  131|      0|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|      0|			break; \
  |  |  335|      0|\
  |  |  336|     41|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 41, False: 8.19k]
  |  |  ------------------
  |  |  337|     41|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  410|     41|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|     41|	{ \
  |  |  |  |  |  |  260|     41|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|     41|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|     41|\
  |  |  |  |  |  |  263|  1.18k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 1.14k, False: 41]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|  1.14k|			q[x] = p[x]; \
  |  |  |  |  |  |  265|     41|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|     41|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 8.24k]
  |  |  ------------------
  |  |  341|      0|			FLOAT(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  410|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|			break; \
  |  |  343|      0|\
  |  |  344|      0|		case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (344:3): [True: 0, False: 8.24k]
  |  |  ------------------
  |  |  345|      0|			COMPLEX(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  411|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|      0|			break; \
  |  |  347|      0|\
  |  |  348|      0|		case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (348:3): [True: 0, False: 8.24k]
  |  |  ------------------
  |  |  349|      0|			COMPLEX(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  411|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  350|      0|			break; \
  |  |  351|      0|\
  |  |  352|      0|		default: \
  |  |  ------------------
  |  |  |  Branch (352:3): [True: 0, False: 8.24k]
  |  |  ------------------
  |  |  353|      0|			g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  354|  8.24k|		} \
  |  |  355|  8.24k|	}
  ------------------
  409|  8.24k|				INT_INT,
  410|  8.24k|				CAST_REAL_FLOAT,
  411|  8.24k|				CAST_REAL_COMPLEX);
  412|  8.24k|			break;
  413|       |
  414|  3.86k|		case VIPS_FORMAT_INT:
  ------------------
  |  Branch (414:3): [True: 3.86k, False: 59.1k]
  ------------------
  415|  3.86k|			BAND_SWITCH_INNER(signed int,
  ------------------
  |  |  310|  3.86k|	{ \
  |  |  311|  3.86k|		switch (conversion->out->BandFmt) { \
  |  |  312|  3.86k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 3.86k, False: 0]
  |  |  ------------------
  |  |  313|  3.86k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  416|  3.86k|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|  3.86k|	{ \
  |  |  |  |  |  |  214|  3.86k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 3.86k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|  3.86k|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|  3.86k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 3.86k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|  3.86k|		else { \
  |  |  |  |  |  |  222|  3.86k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  3.86k|	{ \
  |  |  |  |  |  |  |  |  184|  3.86k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  3.86k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  3.86k|\
  |  |  |  |  |  |  |  |  187|   393k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 390k, False: 3.86k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   390k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   390k|\
  |  |  |  |  |  |  |  |  190|   390k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|   390k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|   390k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   390k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   780k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 43.2k, False: 346k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 85.5k, False: 304k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 85.5k, False: 261k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   390k|		} \
  |  |  |  |  |  |  |  |  192|  3.86k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  3.86k|		} \
  |  |  |  |  |  |  224|  3.86k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  3.86k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 3.86k]
  |  |  ------------------
  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  416|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  124|      0|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|      0|			break; \
  |  |  319|      0|\
  |  |  320|      0|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 0, False: 3.86k]
  |  |  ------------------
  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  416|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  125|      0|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|      0|			break; \
  |  |  323|      0|\
  |  |  324|      0|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 0, False: 3.86k]
  |  |  ------------------
  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  416|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  126|      0|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|      0|			break; \
  |  |  327|      0|\
  |  |  328|      0|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 0, False: 3.86k]
  |  |  ------------------
  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  416|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  130|      0|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|      0|			break; \
  |  |  331|      0|\
  |  |  332|      0|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 0, False: 3.86k]
  |  |  ------------------
  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  416|      0|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|      0|	{ \
  |  |  |  |  |  |  214|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (215:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  216|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  217|      0|		} \
  |  |  |  |  |  |  218|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  219|      0|			SHIFT_LEFT_SIGNED(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  166|      0|	{ \
  |  |  |  |  |  |  |  |  167|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  168|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  169|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  171|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  172|      0|\
  |  |  |  |  |  |  |  |  173|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (173:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  174|      0|			q[x] = VIPS_LSHIFT_INT(p[x], n) | \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  175|      0|				(((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  176|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|      0|		} \
  |  |  |  |  |  |  221|      0|		else { \
  |  |  |  |  |  |  222|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  131|      0|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|      0|		} \
  |  |  |  |  |  |  224|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|      0|			break; \
  |  |  335|      0|\
  |  |  336|      0|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 0, False: 3.86k]
  |  |  ------------------
  |  |  337|      0|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  417|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|      0|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 3.86k]
  |  |  ------------------
  |  |  341|      0|			FLOAT(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  417|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|			break; \
  |  |  343|      0|\
  |  |  344|      0|		case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (344:3): [True: 0, False: 3.86k]
  |  |  ------------------
  |  |  345|      0|			COMPLEX(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  418|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|      0|			break; \
  |  |  347|      0|\
  |  |  348|      0|		case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (348:3): [True: 0, False: 3.86k]
  |  |  ------------------
  |  |  349|      0|			COMPLEX(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  418|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  350|      0|			break; \
  |  |  351|      0|\
  |  |  352|      0|		default: \
  |  |  ------------------
  |  |  |  Branch (352:3): [True: 0, False: 3.86k]
  |  |  ------------------
  |  |  353|      0|			g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  354|  3.86k|		} \
  |  |  355|  3.86k|	}
  ------------------
  416|  3.86k|				INT_INT_SIGNED,
  417|  3.86k|				CAST_REAL_FLOAT,
  418|  3.86k|				CAST_REAL_COMPLEX);
  419|  3.86k|			break;
  420|       |
  421|  32.2k|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (421:3): [True: 32.2k, False: 30.7k]
  ------------------
  422|  32.2k|			BAND_SWITCH_INNER(float,
  ------------------
  |  |  310|  32.2k|	{ \
  |  |  311|  32.2k|		switch (conversion->out->BandFmt) { \
  |  |  312|  18.0k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 18.0k, False: 14.1k]
  |  |  ------------------
  |  |  313|  18.0k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  423|  18.0k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  18.0k|	{ \
  |  |  |  |  |  |  233|  18.0k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  18.0k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  18.0k|\
  |  |  |  |  |  |  236|  1.85M|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 1.83M, False: 18.0k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|  1.83M|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  313|  18.0k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  123|  18.0k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|  1.83M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  3.67M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 114k, False: 1.72M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 27.6k, False: 1.80M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 27.6k, False: 1.69M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  18.0k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  18.0k|			break; \
  |  |  315|      0|\
  |  |  316|  2.67k|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 2.67k, False: 29.5k]
  |  |  ------------------
  |  |  317|  2.67k|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  423|  2.67k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  2.67k|	{ \
  |  |  |  |  |  |  233|  2.67k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  2.67k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  2.67k|\
  |  |  |  |  |  |  236|   400k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 398k, False: 2.67k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|   398k|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  2.67k|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  124|  2.67k|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|   398k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   796k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 7.13k, False: 390k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 41.7k, False: 356k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 41.7k, False: 349k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  2.67k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|  2.67k|			break; \
  |  |  319|      0|\
  |  |  320|  3.79k|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 3.79k, False: 28.4k]
  |  |  ------------------
  |  |  321|  3.79k|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  423|  3.79k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  3.79k|	{ \
  |  |  |  |  |  |  233|  3.79k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  3.79k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  3.79k|\
  |  |  |  |  |  |  236|   403k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 399k, False: 3.79k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|   399k|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  321|  3.79k|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  125|  3.79k|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|   399k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   799k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 11.9k, False: 387k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 10.3k, False: 389k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 10.3k, False: 377k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  3.79k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|  3.79k|			break; \
  |  |  323|      0|\
  |  |  324|  2.08k|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 2.08k, False: 30.1k]
  |  |  ------------------
  |  |  325|  2.08k|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  423|  2.08k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  2.08k|	{ \
  |  |  |  |  |  |  233|  2.08k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  2.08k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  2.08k|\
  |  |  |  |  |  |  236|   279k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 277k, False: 2.08k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|   277k|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  325|  2.08k|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  126|  2.08k|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|   277k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   554k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 2.12k, False: 275k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 5.50k, False: 271k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 5.50k, False: 269k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  2.08k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|  2.08k|			break; \
  |  |  327|      0|\
  |  |  328|  2.03k|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 2.03k, False: 30.2k]
  |  |  ------------------
  |  |  329|  2.03k|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  423|  2.03k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  2.03k|	{ \
  |  |  |  |  |  |  233|  2.03k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  2.03k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  2.03k|\
  |  |  |  |  |  |  236|  90.3k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 88.3k, False: 2.03k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|  88.3k|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  329|  2.03k|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  130|  2.03k|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|  88.3k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   176k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 88.3k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 830, False: 87.5k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 830, False: 87.5k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  2.03k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|  2.03k|			break; \
  |  |  331|      0|\
  |  |  332|  3.59k|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 3.59k, False: 28.6k]
  |  |  ------------------
  |  |  333|  3.59k|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  423|  3.59k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  3.59k|	{ \
  |  |  |  |  |  |  233|  3.59k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  3.59k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  3.59k|\
  |  |  |  |  |  |  236|   365k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 362k, False: 3.59k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|   362k|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  333|  3.59k|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  131|  3.59k|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|   362k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   724k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 2.49k, False: 359k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 5.01k, False: 357k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 5.01k, False: 354k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  3.59k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|  3.59k|			break; \
  |  |  335|      0|\
  |  |  336|      0|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 0, False: 32.2k]
  |  |  ------------------
  |  |  337|      0|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  424|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|      0|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 32.2k]
  |  |  ------------------
  |  |  341|      0|			FLOAT(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  424|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|			break; \
  |  |  343|      0|\
  |  |  344|      0|		case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (344:3): [True: 0, False: 32.2k]
  |  |  ------------------
  |  |  345|      0|			COMPLEX(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  425|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|      0|			break; \
  |  |  347|      0|\
  |  |  348|      0|		case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (348:3): [True: 0, False: 32.2k]
  |  |  ------------------
  |  |  349|      0|			COMPLEX(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  425|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  350|      0|			break; \
  |  |  351|      0|\
  |  |  352|      0|		default: \
  |  |  ------------------
  |  |  |  Branch (352:3): [True: 0, False: 32.2k]
  |  |  ------------------
  |  |  353|      0|			g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  354|  32.2k|		} \
  |  |  355|  32.2k|	}
  ------------------
  423|  32.2k|				CAST_FLOAT_INT,
  424|  32.2k|				CAST_REAL_FLOAT,
  425|  32.2k|				CAST_REAL_COMPLEX);
  426|  32.2k|			break;
  427|       |
  428|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (428:3): [True: 0, False: 63.0k]
  ------------------
  429|      0|			BAND_SWITCH_INNER(double,
  ------------------
  |  |  310|      0|	{ \
  |  |  311|      0|		switch (conversion->out->BandFmt) { \
  |  |  312|      0|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  313|      0|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  430|      0|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|      0|	{ \
  |  |  |  |  |  |  233|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|      0|\
  |  |  |  |  |  |  236|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|      0|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  313|      0|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  123|      0|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|      0|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  430|      0|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|      0|	{ \
  |  |  |  |  |  |  233|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|      0|\
  |  |  |  |  |  |  236|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|      0|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  124|      0|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|      0|			break; \
  |  |  319|      0|\
  |  |  320|      0|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  430|      0|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|      0|	{ \
  |  |  |  |  |  |  233|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|      0|\
  |  |  |  |  |  |  236|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|      0|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  125|      0|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|      0|			break; \
  |  |  323|      0|\
  |  |  324|      0|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  430|      0|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|      0|	{ \
  |  |  |  |  |  |  233|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|      0|\
  |  |  |  |  |  |  236|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|      0|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  126|      0|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|      0|			break; \
  |  |  327|      0|\
  |  |  328|      0|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  430|      0|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|      0|	{ \
  |  |  |  |  |  |  233|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|      0|\
  |  |  |  |  |  |  236|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|      0|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  130|      0|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|      0|			break; \
  |  |  331|      0|\
  |  |  332|      0|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  430|      0|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|      0|	{ \
  |  |  |  |  |  |  233|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|      0|\
  |  |  |  |  |  |  236|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|      0|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  131|      0|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|      0|			break; \
  |  |  335|      0|\
  |  |  336|      0|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  337|      0|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  431|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|      0|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  341|      0|			FLOAT(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  431|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|			break; \
  |  |  343|      0|\
  |  |  344|      0|		case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (344:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  345|      0|			COMPLEX(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  432|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|      0|			break; \
  |  |  347|      0|\
  |  |  348|      0|		case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (348:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  349|      0|			COMPLEX(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  432|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  350|      0|			break; \
  |  |  351|      0|\
  |  |  352|      0|		default: \
  |  |  ------------------
  |  |  |  Branch (352:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  353|      0|			g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  354|      0|		} \
  |  |  355|      0|	}
  ------------------
  430|      0|				CAST_FLOAT_INT,
  431|      0|				CAST_REAL_FLOAT,
  432|      0|				CAST_REAL_COMPLEX);
  433|      0|			break;
  434|       |
  435|      0|		case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (435:3): [True: 0, False: 63.0k]
  ------------------
  436|      0|			BAND_SWITCH_INNER(float,
  ------------------
  |  |  310|      0|	{ \
  |  |  311|      0|		switch (conversion->out->BandFmt) { \
  |  |  312|      0|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  313|      0|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  437|      0|				CAST_COMPLEX_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|	{ \
  |  |  |  |  |  |  247|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  248|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  249|      0|\
  |  |  |  |  |  |  250|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (250:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  251|      0|			q[x] = CAST((double) p[0]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  313|      0|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  123|      0|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  252|      0|			p += 2; \
  |  |  |  |  |  |  253|      0|		} \
  |  |  |  |  |  |  254|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|      0|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  437|      0|				CAST_COMPLEX_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|	{ \
  |  |  |  |  |  |  247|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  248|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  249|      0|\
  |  |  |  |  |  |  250|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (250:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  251|      0|			q[x] = CAST((double) p[0]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  124|      0|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  252|      0|			p += 2; \
  |  |  |  |  |  |  253|      0|		} \
  |  |  |  |  |  |  254|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|      0|			break; \
  |  |  319|      0|\
  |  |  320|      0|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  437|      0|				CAST_COMPLEX_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|	{ \
  |  |  |  |  |  |  247|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  248|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  249|      0|\
  |  |  |  |  |  |  250|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (250:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  251|      0|			q[x] = CAST((double) p[0]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  125|      0|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  252|      0|			p += 2; \
  |  |  |  |  |  |  253|      0|		} \
  |  |  |  |  |  |  254|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|      0|			break; \
  |  |  323|      0|\
  |  |  324|      0|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  437|      0|				CAST_COMPLEX_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|	{ \
  |  |  |  |  |  |  247|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  248|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  249|      0|\
  |  |  |  |  |  |  250|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (250:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  251|      0|			q[x] = CAST((double) p[0]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  126|      0|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  252|      0|			p += 2; \
  |  |  |  |  |  |  253|      0|		} \
  |  |  |  |  |  |  254|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|      0|			break; \
  |  |  327|      0|\
  |  |  328|      0|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  437|      0|				CAST_COMPLEX_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|	{ \
  |  |  |  |  |  |  247|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  248|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  249|      0|\
  |  |  |  |  |  |  250|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (250:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  251|      0|			q[x] = CAST((double) p[0]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  130|      0|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  252|      0|			p += 2; \
  |  |  |  |  |  |  253|      0|		} \
  |  |  |  |  |  |  254|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|      0|			break; \
  |  |  331|      0|\
  |  |  332|      0|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  437|      0|				CAST_COMPLEX_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|	{ \
  |  |  |  |  |  |  247|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  248|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  249|      0|\
  |  |  |  |  |  |  250|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (250:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  251|      0|			q[x] = CAST((double) p[0]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  131|      0|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  252|      0|			p += 2; \
  |  |  |  |  |  |  253|      0|		} \
  |  |  |  |  |  |  254|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|      0|			break; \
  |  |  335|      0|\
  |  |  336|      0|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  337|      0|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  438|      0|				CAST_COMPLEX_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  270|      0|	{ \
  |  |  |  |  |  |  271|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  272|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  273|      0|\
  |  |  |  |  |  |  274|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (274:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  275|      0|			q[x] = p[0]; \
  |  |  |  |  |  |  276|      0|			p += 2; \
  |  |  |  |  |  |  277|      0|		} \
  |  |  |  |  |  |  278|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|      0|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  341|      0|			FLOAT(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  438|      0|				CAST_COMPLEX_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  270|      0|	{ \
  |  |  |  |  |  |  271|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  272|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  273|      0|\
  |  |  |  |  |  |  274|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (274:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  275|      0|			q[x] = p[0]; \
  |  |  |  |  |  |  276|      0|			p += 2; \
  |  |  |  |  |  |  277|      0|		} \
  |  |  |  |  |  |  278|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|			break; \
  |  |  343|      0|\
  |  |  344|      0|		case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (344:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  345|      0|			COMPLEX(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  439|      0|				CAST_COMPLEX_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|	{ \
  |  |  |  |  |  |  298|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  299|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  300|      0|\
  |  |  |  |  |  |  301|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (301:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  302|      0|			q[0] = p[0]; \
  |  |  |  |  |  |  303|      0|			q[1] = p[1]; \
  |  |  |  |  |  |  304|      0|			p += 2; \
  |  |  |  |  |  |  305|      0|			q += 2; \
  |  |  |  |  |  |  306|      0|		} \
  |  |  |  |  |  |  307|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|      0|			break; \
  |  |  347|      0|\
  |  |  348|      0|		case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (348:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  349|      0|			COMPLEX(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  439|      0|				CAST_COMPLEX_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|	{ \
  |  |  |  |  |  |  298|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  299|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  300|      0|\
  |  |  |  |  |  |  301|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (301:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  302|      0|			q[0] = p[0]; \
  |  |  |  |  |  |  303|      0|			q[1] = p[1]; \
  |  |  |  |  |  |  304|      0|			p += 2; \
  |  |  |  |  |  |  305|      0|			q += 2; \
  |  |  |  |  |  |  306|      0|		} \
  |  |  |  |  |  |  307|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  350|      0|			break; \
  |  |  351|      0|\
  |  |  352|      0|		default: \
  |  |  ------------------
  |  |  |  Branch (352:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  353|      0|			g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  354|      0|		} \
  |  |  355|      0|	}
  ------------------
  437|      0|				CAST_COMPLEX_INT,
  438|      0|				CAST_COMPLEX_FLOAT,
  439|      0|				CAST_COMPLEX_COMPLEX);
  440|      0|			break;
  441|       |
  442|      0|		case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (442:3): [True: 0, False: 63.0k]
  ------------------
  443|      0|			BAND_SWITCH_INNER(double,
  ------------------
  |  |  310|      0|	{ \
  |  |  311|      0|		switch (conversion->out->BandFmt) { \
  |  |  312|      0|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  313|      0|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  444|      0|				CAST_COMPLEX_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|	{ \
  |  |  |  |  |  |  247|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  248|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  249|      0|\
  |  |  |  |  |  |  250|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (250:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  251|      0|			q[x] = CAST((double) p[0]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  313|      0|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  123|      0|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  252|      0|			p += 2; \
  |  |  |  |  |  |  253|      0|		} \
  |  |  |  |  |  |  254|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|      0|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  444|      0|				CAST_COMPLEX_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|	{ \
  |  |  |  |  |  |  247|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  248|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  249|      0|\
  |  |  |  |  |  |  250|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (250:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  251|      0|			q[x] = CAST((double) p[0]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  124|      0|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  252|      0|			p += 2; \
  |  |  |  |  |  |  253|      0|		} \
  |  |  |  |  |  |  254|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|      0|			break; \
  |  |  319|      0|\
  |  |  320|      0|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  444|      0|				CAST_COMPLEX_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|	{ \
  |  |  |  |  |  |  247|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  248|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  249|      0|\
  |  |  |  |  |  |  250|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (250:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  251|      0|			q[x] = CAST((double) p[0]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  125|      0|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  252|      0|			p += 2; \
  |  |  |  |  |  |  253|      0|		} \
  |  |  |  |  |  |  254|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|      0|			break; \
  |  |  323|      0|\
  |  |  324|      0|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  444|      0|				CAST_COMPLEX_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|	{ \
  |  |  |  |  |  |  247|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  248|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  249|      0|\
  |  |  |  |  |  |  250|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (250:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  251|      0|			q[x] = CAST((double) p[0]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  126|      0|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  252|      0|			p += 2; \
  |  |  |  |  |  |  253|      0|		} \
  |  |  |  |  |  |  254|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|      0|			break; \
  |  |  327|      0|\
  |  |  328|      0|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  444|      0|				CAST_COMPLEX_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|	{ \
  |  |  |  |  |  |  247|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  248|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  249|      0|\
  |  |  |  |  |  |  250|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (250:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  251|      0|			q[x] = CAST((double) p[0]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  130|      0|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  252|      0|			p += 2; \
  |  |  |  |  |  |  253|      0|		} \
  |  |  |  |  |  |  254|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|      0|			break; \
  |  |  331|      0|\
  |  |  332|      0|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  444|      0|				CAST_COMPLEX_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|	{ \
  |  |  |  |  |  |  247|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  248|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  249|      0|\
  |  |  |  |  |  |  250|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (250:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  251|      0|			q[x] = CAST((double) p[0]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  131|      0|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  252|      0|			p += 2; \
  |  |  |  |  |  |  253|      0|		} \
  |  |  |  |  |  |  254|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|      0|			break; \
  |  |  335|      0|\
  |  |  336|      0|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  337|      0|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  445|      0|				CAST_COMPLEX_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  270|      0|	{ \
  |  |  |  |  |  |  271|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  272|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  273|      0|\
  |  |  |  |  |  |  274|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (274:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  275|      0|			q[x] = p[0]; \
  |  |  |  |  |  |  276|      0|			p += 2; \
  |  |  |  |  |  |  277|      0|		} \
  |  |  |  |  |  |  278|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|      0|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  341|      0|			FLOAT(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  445|      0|				CAST_COMPLEX_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  270|      0|	{ \
  |  |  |  |  |  |  271|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  272|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  273|      0|\
  |  |  |  |  |  |  274|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (274:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  275|      0|			q[x] = p[0]; \
  |  |  |  |  |  |  276|      0|			p += 2; \
  |  |  |  |  |  |  277|      0|		} \
  |  |  |  |  |  |  278|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|			break; \
  |  |  343|      0|\
  |  |  344|      0|		case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (344:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  345|      0|			COMPLEX(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  446|      0|				CAST_COMPLEX_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|	{ \
  |  |  |  |  |  |  298|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  299|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  300|      0|\
  |  |  |  |  |  |  301|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (301:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  302|      0|			q[0] = p[0]; \
  |  |  |  |  |  |  303|      0|			q[1] = p[1]; \
  |  |  |  |  |  |  304|      0|			p += 2; \
  |  |  |  |  |  |  305|      0|			q += 2; \
  |  |  |  |  |  |  306|      0|		} \
  |  |  |  |  |  |  307|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|      0|			break; \
  |  |  347|      0|\
  |  |  348|      0|		case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (348:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  349|      0|			COMPLEX(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  446|      0|				CAST_COMPLEX_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|	{ \
  |  |  |  |  |  |  298|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  299|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  300|      0|\
  |  |  |  |  |  |  301|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (301:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  302|      0|			q[0] = p[0]; \
  |  |  |  |  |  |  303|      0|			q[1] = p[1]; \
  |  |  |  |  |  |  304|      0|			p += 2; \
  |  |  |  |  |  |  305|      0|			q += 2; \
  |  |  |  |  |  |  306|      0|		} \
  |  |  |  |  |  |  307|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  350|      0|			break; \
  |  |  351|      0|\
  |  |  352|      0|		default: \
  |  |  ------------------
  |  |  |  Branch (352:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  353|      0|			g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  354|      0|		} \
  |  |  355|      0|	}
  ------------------
  444|      0|				CAST_COMPLEX_INT,
  445|      0|				CAST_COMPLEX_FLOAT,
  446|      0|				CAST_COMPLEX_COMPLEX);
  447|      0|			break;
  448|       |
  449|      0|		default:
  ------------------
  |  Branch (449:3): [True: 0, False: 63.0k]
  ------------------
  450|      0|			g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  451|  63.0k|		}
  452|  63.0k|	}
  453|       |
  454|  12.6k|	VIPS_GATE_STOP("vips_cast_gen: work");
  ------------------
  |  |   49|  12.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  12.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  12.6k|	{ \
  |  |   51|  12.6k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 12.6k]
  |  |  ------------------
  |  |   52|  12.6k|			vips__thread_gate_stop(NAME); \
  |  |   53|  12.6k|	} \
  |  |   54|  12.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  455|       |
  456|  12.6k|	return 0;
  457|  12.6k|}
cast.c:vips_cast_init:
  552|  23.0k|{
  553|  23.0k|}
cast.c:vips_castv:
  557|  23.0k|{
  558|  23.0k|	return vips_call_split("cast", ap, in, out, format);
  559|  23.0k|}

composite.cpp:_ZL30vips_composite_base_class_initP20_VipsConversionClass:
 1466|      1|{
 1467|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1468|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(klass);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1469|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(klass);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
 1470|       |
 1471|      1|	VIPS_DEBUG_MSG("vips_composite_base_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1472|       |
 1473|      1|	gobject_class->dispose = vips_composite_base_dispose;
 1474|      1|	gobject_class->set_property = vips_object_set_property;
 1475|      1|	gobject_class->get_property = vips_object_get_property;
 1476|       |
 1477|      1|	vobject_class->nickname = "composite_base";
 1478|      1|	vobject_class->description = _("blend images together");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1479|      1|	vobject_class->build = vips_composite_base_build;
 1480|       |
 1481|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
 1482|       |
 1483|      1|	VIPS_ARG_ENUM(klass, "compositing_space", 10,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
 1484|      1|		_("Compositing space"),
 1485|      1|		_("Composite images in this colour space"),
 1486|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1487|      1|		G_STRUCT_OFFSET(VipsCompositeBase, compositing_space),
 1488|      1|		VIPS_TYPE_INTERPRETATION, VIPS_INTERPRETATION_sRGB);
 1489|       |
 1490|      1|	VIPS_ARG_BOOL(klass, "premultiplied", 11,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1491|      1|		_("Premultiplied"),
 1492|      1|		_("Images have premultiplied alpha"),
 1493|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1494|      1|		G_STRUCT_OFFSET(VipsCompositeBase, premultiplied),
 1495|      1|		FALSE);
 1496|      1|}
composite.cpp:_ZL25vips_composite_class_initP20_VipsConversionClass:
 1562|      1|{
 1563|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1564|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(klass);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1565|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(klass);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
 1566|       |
 1567|      1|	VIPS_DEBUG_MSG("vips_composite_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1568|       |
 1569|      1|	gobject_class->set_property = vips_object_set_property;
 1570|      1|	gobject_class->get_property = vips_object_get_property;
 1571|       |
 1572|      1|	vobject_class->nickname = "composite";
 1573|      1|	vobject_class->description =
 1574|      1|		_("blend an array of images with an array of blend modes");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1575|      1|	vobject_class->build = vips_composite_build;
 1576|       |
 1577|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
 1578|       |
 1579|      1|	VIPS_ARG_BOXED(klass, "in", 0,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
 1580|      1|		_("Inputs"),
 1581|      1|		_("Array of input images"),
 1582|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1583|      1|		G_STRUCT_OFFSET(VipsCompositeBase, in),
 1584|      1|		VIPS_TYPE_ARRAY_IMAGE);
 1585|       |
 1586|      1|	VIPS_ARG_BOXED(klass, "mode", 3,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
 1587|      1|		_("Blend modes"),
 1588|      1|		_("Array of VipsBlendMode to join with"),
 1589|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1590|      1|		G_STRUCT_OFFSET(VipsCompositeBase, mode),
 1591|      1|		VIPS_TYPE_ARRAY_INT);
 1592|       |
 1593|      1|	VIPS_ARG_BOXED(klass, "x", 4,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
 1594|      1|		_("x coordinates"),
 1595|      1|		_("Array of x coordinates to join at"),
 1596|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1597|      1|		G_STRUCT_OFFSET(VipsComposite, x),
 1598|      1|		VIPS_TYPE_ARRAY_INT);
 1599|       |
 1600|      1|	VIPS_ARG_BOXED(klass, "y", 5,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
 1601|      1|		_("y coordinates"),
 1602|      1|		_("Array of y coordinates to join at"),
 1603|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1604|      1|		G_STRUCT_OFFSET(VipsComposite, y),
 1605|      1|		VIPS_TYPE_ARRAY_INT);
 1606|      1|}
composite.cpp:_ZL26vips_composite2_class_initP20_VipsConversionClass:
 1696|      1|{
 1697|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1698|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(klass);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1699|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(klass);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
 1700|       |
 1701|      1|	VIPS_DEBUG_MSG("vips_composite_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1702|       |
 1703|      1|	gobject_class->set_property = vips_object_set_property;
 1704|      1|	gobject_class->get_property = vips_object_get_property;
 1705|       |
 1706|      1|	vobject_class->nickname = "composite2";
 1707|      1|	vobject_class->description =
 1708|      1|		_("blend a pair of images with a blend mode");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1709|      1|	vobject_class->build = vips_composite2_build;
 1710|       |
 1711|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
 1712|       |
 1713|      1|	VIPS_ARG_IMAGE(klass, "base", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
 1714|      1|		_("Base"),
 1715|      1|		_("Base image"),
 1716|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1717|      1|		G_STRUCT_OFFSET(VipsComposite2, base));
 1718|       |
 1719|      1|	VIPS_ARG_IMAGE(klass, "overlay", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
 1720|      1|		_("Overlay"),
 1721|      1|		_("Overlay image"),
 1722|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1723|      1|		G_STRUCT_OFFSET(VipsComposite2, overlay));
 1724|       |
 1725|      1|	VIPS_ARG_ENUM(klass, "mode", 3,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
 1726|      1|		_("Blend mode"),
 1727|      1|		_("VipsBlendMode to join with"),
 1728|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1729|      1|		G_STRUCT_OFFSET(VipsComposite2, mode),
 1730|      1|		VIPS_TYPE_BLEND_MODE, VIPS_BLEND_MODE_OVER);
 1731|       |
 1732|      1|	VIPS_ARG_INT(klass, "x", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1733|      1|		_("x"),
 1734|      1|		_("x position of overlay"),
 1735|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1736|      1|		G_STRUCT_OFFSET(VipsComposite2, x),
 1737|      1|		-VIPS_MAX_COORD, VIPS_MAX_COORD, 0);
 1738|       |
 1739|      1|	VIPS_ARG_INT(klass, "y", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1740|      1|		_("y"),
 1741|      1|		_("y position of overlay"),
 1742|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1743|      1|		G_STRUCT_OFFSET(VipsComposite2, y),
 1744|      1|		-VIPS_MAX_COORD, VIPS_MAX_COORD, 0);
 1745|      1|}

vips_conversion_operation_init:
  362|      2|{
  363|      2|	extern GType vips_copy_get_type(void);
  364|      2|	extern GType vips_tile_cache_get_type(void);
  365|      2|	extern GType vips_line_cache_get_type(void);
  366|      2|	extern GType vips_sequential_get_type(void);
  367|      2|	extern GType vips_cache_get_type(void);
  368|      2|	extern GType vips_embed_get_type(void);
  369|      2|	extern GType vips_gravity_get_type(void);
  370|      2|	extern GType vips_flip_get_type(void);
  371|      2|	extern GType vips_insert_get_type(void);
  372|      2|	extern GType vips_join_get_type(void);
  373|      2|	extern GType vips_arrayjoin_get_type(void);
  374|      2|	extern GType vips_extract_area_get_type(void);
  375|      2|	extern GType vips_crop_get_type(void);
  376|      2|	extern GType vips_smartcrop_get_type(void);
  377|      2|	extern GType vips_extract_band_get_type(void);
  378|      2|	extern GType vips_replicate_get_type(void);
  379|      2|	extern GType vips_cast_get_type(void);
  380|      2|	extern GType vips_bandjoin_get_type(void);
  381|      2|	extern GType vips_bandjoin_const_get_type(void);
  382|      2|	extern GType vips_bandrank_get_type(void);
  383|      2|	extern GType vips_black_get_type(void);
  384|      2|	extern GType vips_rot_get_type(void);
  385|      2|	extern GType vips_rot45_get_type(void);
  386|      2|	extern GType vips_autorot_get_type(void);
  387|      2|	extern GType vips_ifthenelse_get_type(void);
  388|      2|	extern GType vips_switch_get_type(void);
  389|      2|	extern GType vips_recomb_get_type(void);
  390|      2|	extern GType vips_bandmean_get_type(void);
  391|      2|	extern GType vips_bandfold_get_type(void);
  392|      2|	extern GType vips_bandunfold_get_type(void);
  393|      2|	extern GType vips_flatten_get_type(void);
  394|      2|	extern GType vips_premultiply_get_type(void);
  395|      2|	extern GType vips_unpremultiply_get_type(void);
  396|      2|	extern GType vips_bandbool_get_type(void);
  397|      2|	extern GType vips_gaussnoise_get_type(void);
  398|      2|	extern GType vips_grid_get_type(void);
  399|      2|	extern GType vips_transpose3d_get_type(void);
  400|      2|	extern GType vips_scale_get_type(void);
  401|      2|	extern GType vips_wrap_get_type(void);
  402|      2|	extern GType vips_zoom_get_type(void);
  403|      2|	extern GType vips_subsample_get_type(void);
  404|      2|	extern GType vips_msb_get_type(void);
  405|      2|	extern GType vips_byteswap_get_type(void);
  406|      2|	extern GType vips_xyz_get_type(void);
  407|      2|	extern GType vips_falsecolour_get_type(void);
  408|      2|	extern GType vips_gamma_get_type(void);
  409|      2|	extern GType vips_composite_get_type(void);
  410|      2|	extern GType vips_composite2_get_type(void);
  411|      2|	extern GType vips_addalpha_get_type(void);
  412|       |
  413|      2|	vips_copy_get_type();
  414|      2|	vips_tile_cache_get_type();
  415|      2|	vips_line_cache_get_type();
  416|      2|	vips_sequential_get_type();
  417|      2|	vips_cache_get_type();
  418|      2|	vips_embed_get_type();
  419|      2|	vips_gravity_get_type();
  420|      2|	vips_flip_get_type();
  421|      2|	vips_insert_get_type();
  422|      2|	vips_join_get_type();
  423|      2|	vips_arrayjoin_get_type();
  424|      2|	vips_extract_area_get_type();
  425|      2|	vips_crop_get_type();
  426|      2|	vips_smartcrop_get_type();
  427|      2|	vips_extract_band_get_type();
  428|      2|	vips_replicate_get_type();
  429|      2|	vips_cast_get_type();
  430|      2|	vips_bandjoin_get_type();
  431|      2|	vips_bandjoin_const_get_type();
  432|      2|	vips_bandrank_get_type();
  433|      2|	vips_black_get_type();
  434|      2|	vips_rot_get_type();
  435|      2|	vips_rot45_get_type();
  436|      2|	vips_autorot_get_type();
  437|      2|	vips_ifthenelse_get_type();
  438|      2|	vips_switch_get_type();
  439|      2|	vips_recomb_get_type();
  440|      2|	vips_bandmean_get_type();
  441|      2|	vips_bandfold_get_type();
  442|      2|	vips_bandunfold_get_type();
  443|      2|	vips_flatten_get_type();
  444|      2|	vips_premultiply_get_type();
  445|      2|	vips_unpremultiply_get_type();
  446|      2|	vips_bandbool_get_type();
  447|      2|	vips_gaussnoise_get_type();
  448|      2|	vips_grid_get_type();
  449|      2|	vips_transpose3d_get_type();
  450|      2|	vips_scale_get_type();
  451|      2|	vips_wrap_get_type();
  452|      2|	vips_zoom_get_type();
  453|      2|	vips_subsample_get_type();
  454|      2|	vips_msb_get_type();
  455|      2|	vips_byteswap_get_type();
  456|      2|	vips_xyz_get_type();
  457|      2|	vips_falsecolour_get_type();
  458|      2|	vips_gamma_get_type();
  459|      2|	vips_composite_get_type();
  460|      2|	vips_composite2_get_type();
  461|      2|	vips_addalpha_get_type();
  462|      2|}
conversion.c:vips_conversion_class_init:
  334|      1|{
  335|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  336|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  337|       |
  338|      1|	gobject_class->set_property = vips_object_set_property;
  339|      1|	gobject_class->get_property = vips_object_get_property;
  340|       |
  341|      1|	vobject_class->nickname = "conversion";
  342|      1|	vobject_class->description = _("conversion operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  343|      1|	vobject_class->build = vips_conversion_build;
  344|       |
  345|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  346|      1|		_("Output"),
  347|      1|		_("Output image"),
  348|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  349|      1|		G_STRUCT_OFFSET(VipsConversion, out));
  350|      1|}
conversion.c:vips_conversion_build:
  315|   122k|{
  316|   122k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|   122k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   122k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   122k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|   122k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  317|       |
  318|       |#ifdef DEBUG
  319|       |	printf("vips_conversion_build: ");
  320|       |	vips_object_print_name(object);
  321|       |	printf("\n");
  322|       |#endif /*DEBUG*/
  323|       |
  324|   122k|	g_object_set(conversion, "out", vips_image_new(), NULL);
  325|       |
  326|   122k|	if (VIPS_OBJECT_CLASS(vips_conversion_parent_class)->build(object))
  ------------------
  |  |  435|   122k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   122k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   122k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (326:6): [True: 0, False: 122k]
  ------------------
  327|      0|		return -1;
  328|       |
  329|   122k|	return 0;
  330|   122k|}
conversion.c:vips_conversion_init:
  354|   122k|{
  355|   122k|}

vips_copy:
  395|  57.8k|{
  396|  57.8k|	va_list ap;
  397|  57.8k|	int result;
  398|       |
  399|  57.8k|	va_start(ap, out);
  400|  57.8k|	result = vips_call_split("copy", ap, in, out);
  401|  57.8k|	va_end(ap);
  402|       |
  403|  57.8k|	return result;
  404|  57.8k|}
copy.c:vips_copy_class_init:
  250|      1|{
  251|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  252|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  253|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  254|       |
  255|      1|	VIPS_DEBUG_MSG("vips_copy_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|       |
  257|      1|	gobject_class->set_property = vips_object_set_property;
  258|      1|	gobject_class->get_property = vips_object_get_property;
  259|       |
  260|      1|	vobject_class->nickname = "copy";
  261|      1|	vobject_class->description = _("copy an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  262|      1|	vobject_class->build = vips_copy_build;
  263|       |
  264|       |	/* We use copy to make fresh vipsimages to stop sharing, so don't
  265|       |	 * cache it. Plus copy is cheap.
  266|       |	 */
  267|      1|	operation_class->flags =
  268|      1|		VIPS_OPERATION_SEQUENTIAL |
  269|      1|		VIPS_OPERATION_NOCACHE;
  270|       |
  271|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  272|      1|		_("Input"),
  273|      1|		_("Input image"),
  274|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  275|      1|		G_STRUCT_OFFSET(VipsCopy, in));
  276|       |
  277|      1|	VIPS_ARG_BOOL(class, "swap", 2,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  278|      1|		_("Swap"),
  279|      1|		_("Swap bytes in image between little and big-endian"),
  280|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  281|      1|		G_STRUCT_OFFSET(VipsCopy, swap),
  282|      1|		FALSE);
  283|       |
  284|      1|	VIPS_ARG_INT(class, "width", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  285|      1|		_("Width"),
  286|      1|		_("Image width in pixels"),
  287|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  288|      1|		G_STRUCT_OFFSET(VipsCopy, width),
  289|      1|		0, VIPS_MAX_COORD, 0);
  290|       |
  291|      1|	VIPS_ARG_INT(class, "height", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  292|      1|		_("Height"),
  293|      1|		_("Image height in pixels"),
  294|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  295|      1|		G_STRUCT_OFFSET(VipsCopy, height),
  296|      1|		0, VIPS_MAX_COORD, 0);
  297|       |
  298|      1|	VIPS_ARG_INT(class, "bands", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  299|      1|		_("Bands"),
  300|      1|		_("Number of bands in image"),
  301|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  302|      1|		G_STRUCT_OFFSET(VipsCopy, bands),
  303|      1|		0, VIPS_MAX_COORD, 0);
  304|       |
  305|      1|	VIPS_ARG_ENUM(class, "format", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  306|      1|		_("Format"),
  307|      1|		_("Pixel format in image"),
  308|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  309|      1|		G_STRUCT_OFFSET(VipsCopy, format),
  310|      1|		VIPS_TYPE_BAND_FORMAT, VIPS_FORMAT_UCHAR);
  311|       |
  312|      1|	VIPS_ARG_ENUM(class, "coding", 7,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  313|      1|		_("Coding"),
  314|      1|		_("Pixel coding"),
  315|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  316|      1|		G_STRUCT_OFFSET(VipsCopy, coding),
  317|      1|		VIPS_TYPE_CODING, VIPS_CODING_NONE);
  318|       |
  319|      1|	VIPS_ARG_ENUM(class, "interpretation", 8,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  320|      1|		_("Interpretation"),
  321|      1|		_("Pixel interpretation"),
  322|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  323|      1|		G_STRUCT_OFFSET(VipsCopy, interpretation),
  324|      1|		VIPS_TYPE_INTERPRETATION, VIPS_INTERPRETATION_MULTIBAND);
  325|       |
  326|      1|	VIPS_ARG_DOUBLE(class, "xres", 9,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  327|      1|		_("Xres"),
  328|      1|		_("Horizontal resolution in pixels/mm"),
  329|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  330|      1|		G_STRUCT_OFFSET(VipsCopy, xres),
  331|      1|		-0.0, 1000000, 0);
  332|       |
  333|      1|	VIPS_ARG_DOUBLE(class, "yres", 10,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  334|      1|		_("Yres"),
  335|      1|		_("Vertical resolution in pixels/mm"),
  336|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  337|      1|		G_STRUCT_OFFSET(VipsCopy, yres),
  338|      1|		-0.0, 1000000, 0);
  339|       |
  340|      1|	VIPS_ARG_INT(class, "xoffset", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  341|      1|		_("Xoffset"),
  342|      1|		_("Horizontal offset of origin"),
  343|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  344|      1|		G_STRUCT_OFFSET(VipsCopy, xoffset),
  345|      1|		-VIPS_MAX_COORD, VIPS_MAX_COORD, 0);
  346|       |
  347|      1|	VIPS_ARG_INT(class, "yoffset", 12,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  348|      1|		_("Yoffset"),
  349|      1|		_("Vertical offset of origin"),
  350|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  351|      1|		G_STRUCT_OFFSET(VipsCopy, yoffset),
  352|      1|		-VIPS_MAX_COORD, VIPS_MAX_COORD, 0);
  353|      1|}
copy.c:vips_copy_build:
  164|  57.8k|{
  165|  57.8k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  57.8k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  57.8k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  57.8k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  166|  57.8k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  57.8k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  57.8k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  57.8k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  57.8k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  167|  57.8k|	VipsCopy *copy = (VipsCopy *) object;
  168|       |
  169|  57.8k|	guint64 pel_size_before;
  170|  57.8k|	guint64 pel_size_after;
  171|  57.8k|	VipsImage copy_of_fields;
  172|  57.8k|	int i;
  173|       |
  174|  57.8k|	if (VIPS_OBJECT_CLASS(vips_copy_parent_class)->build(object))
  ------------------
  |  |  435|  57.8k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  57.8k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  57.8k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (174:6): [True: 0, False: 57.8k]
  ------------------
  175|      0|		return -1;
  176|       |
  177|  57.8k|	if (vips_image_pio_input(copy->in))
  ------------------
  |  Branch (177:6): [True: 0, False: 57.8k]
  ------------------
  178|      0|		return -1;
  179|       |
  180|  57.8k|	if (copy->swap)
  ------------------
  |  Branch (180:6): [True: 0, False: 57.8k]
  ------------------
  181|      0|		g_warning("%s",
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  182|  57.8k|			_("copy swap is deprecated, use byteswap instead"));
  183|       |
  184|  57.8k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (184:6): [True: 0, False: 57.8k]
  ------------------
  185|  57.8k|			VIPS_DEMAND_STYLE_THINSTRIP, copy->in, NULL))
  186|      0|		return -1;
  187|       |
  188|       |	/* Take a copy of all the basic header fields. We use this for
  189|       |	 * sanity-checking the changes our caller has made.
  190|       |	 */
  191|  57.8k|	copy_of_fields = *conversion->out;
  192|       |
  193|       |	/* Use props to adjust header fields.
  194|       |	 */
  195|   636k|	for (i = 0; i < VIPS_NUMBER(vips_copy_names); i++) {
  ------------------
  |  |   60|   636k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (195:14): [True: 578k, False: 57.8k]
  ------------------
  196|   578k|		const char *name = vips_copy_names[i];
  197|       |
  198|   578k|		GParamSpec *pspec;
  199|   578k|		VipsArgumentClass *argument_class;
  200|   578k|		VipsArgumentInstance *argument_instance;
  201|       |
  202|   578k|		if (vips_object_get_argument(object, name,
  ------------------
  |  Branch (202:7): [True: 0, False: 578k]
  ------------------
  203|   578k|				&pspec, &argument_class, &argument_instance))
  204|      0|			return -1;
  205|       |
  206|   578k|		if (argument_instance->assigned) {
  ------------------
  |  Branch (206:7): [True: 0, False: 578k]
  ------------------
  207|      0|			GType type = G_PARAM_SPEC_VALUE_TYPE(pspec);
  ------------------
  |  |  103|      0|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|      0|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  208|      0|			GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|      0|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
  209|       |
  210|      0|			g_value_init(&value, type);
  211|      0|			g_object_get_property(G_OBJECT(object),
  ------------------
  |  |   51|      0|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  212|      0|				name, &value);
  213|       |
  214|       |#ifdef VIPS_DEBUG
  215|       |			{
  216|       |				char *str;
  217|       |
  218|       |				str = g_strdup_value_contents(&value);
  219|       |				printf("vips_copy_build: %s = %s\n", name, str);
  220|       |				g_free(str);
  221|       |			}
  222|       |#endif /* VIPS_DEBUG */
  223|       |
  224|      0|			g_object_set_property(G_OBJECT(conversion->out),
  ------------------
  |  |   51|      0|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  225|      0|				name, &value);
  226|      0|			g_value_unset(&value);
  227|      0|		}
  228|   578k|	}
  229|       |
  230|       |	/* Disallow changes which alter sizeof(pel).
  231|       |	 */
  232|  57.8k|	pel_size_before = VIPS_IMAGE_SIZEOF_PEL(&copy_of_fields);
  ------------------
  |  |  384|  57.8k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  57.8k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  233|  57.8k|	pel_size_after = VIPS_IMAGE_SIZEOF_PEL(conversion->out);
  ------------------
  |  |  384|  57.8k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  57.8k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  234|  57.8k|	if (pel_size_after != pel_size_before) {
  ------------------
  |  Branch (234:6): [True: 0, False: 57.8k]
  ------------------
  235|      0|		vips_error(class->nickname,
  236|      0|			"%s", _("must not change pel size"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  237|      0|		return -1;
  238|      0|	}
  239|       |
  240|  57.8k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (240:6): [True: 0, False: 57.8k]
  ------------------
  241|  57.8k|			vips_start_one, vips_copy_gen, vips_stop_one,
  242|  57.8k|			copy->in, copy))
  243|      0|		return -1;
  244|       |
  245|  57.8k|	return 0;
  246|  57.8k|}
copy.c:vips_copy_gen:
  136|  93.5k|{
  137|  93.5k|	VipsRegion *ir = (VipsRegion *) seq;
  138|  93.5k|	VipsRect *r = &out_region->valid;
  139|       |
  140|  93.5k|	if (vips_region_prepare(ir, r) ||
  ------------------
  |  Branch (140:6): [True: 14.1k, False: 79.3k]
  ------------------
  141|  93.5k|		vips_region_region(out_region, ir, r, r->left, r->top))
  ------------------
  |  Branch (141:3): [True: 0, False: 79.3k]
  ------------------
  142|  14.1k|		return -1;
  143|       |
  144|  79.3k|	return 0;
  145|  93.5k|}
copy.c:vips_copy_init:
  357|  57.8k|{
  358|       |	/* Init our instance fields.
  359|       |	 */
  360|  57.8k|}

embed.c:vips_embed_base_class_init:
  551|      1|{
  552|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  553|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  554|       |
  555|      1|	VIPS_DEBUG_MSG("vips_embed_base_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  556|       |
  557|      1|	gobject_class->set_property = vips_object_set_property;
  558|      1|	gobject_class->get_property = vips_object_get_property;
  559|       |
  560|      1|	vobject_class->nickname = "embed_base";
  561|      1|	vobject_class->description = _("embed an image in a larger image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  562|      1|	vobject_class->build = vips_embed_base_build;
  563|       |
  564|       |	/* Not seq with mirror.
  565|       |	 */
  566|       |
  567|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  568|      1|		_("Input"),
  569|      1|		_("Input image"),
  570|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  571|      1|		G_STRUCT_OFFSET(VipsEmbedBase, in));
  572|       |
  573|      1|	VIPS_ARG_INT(class, "width", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  574|      1|		_("Width"),
  575|      1|		_("Image width in pixels"),
  576|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  577|      1|		G_STRUCT_OFFSET(VipsEmbedBase, width),
  578|      1|		1, 1000000000, 1);
  579|       |
  580|      1|	VIPS_ARG_INT(class, "height", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  581|      1|		_("Height"),
  582|      1|		_("Image height in pixels"),
  583|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  584|      1|		G_STRUCT_OFFSET(VipsEmbedBase, height),
  585|      1|		1, 1000000000, 1);
  586|       |
  587|      1|	VIPS_ARG_ENUM(class, "extend", 7,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  588|      1|		_("Extend"),
  589|      1|		_("How to generate the extra pixels"),
  590|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  591|      1|		G_STRUCT_OFFSET(VipsEmbedBase, extend),
  592|      1|		VIPS_TYPE_EXTEND, VIPS_EXTEND_BLACK);
  593|       |
  594|      1|	VIPS_ARG_BOXED(class, "background", 12,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  595|      1|		_("Background"),
  596|      1|		_("Color for background pixels"),
  597|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  598|      1|		G_STRUCT_OFFSET(VipsEmbedBase, background),
  599|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  600|      1|}
embed.c:vips_embed_class_init:
  642|      1|{
  643|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  644|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  645|       |
  646|      1|	VIPS_DEBUG_MSG("vips_embed_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  647|       |
  648|      1|	gobject_class->set_property = vips_object_set_property;
  649|      1|	gobject_class->get_property = vips_object_get_property;
  650|       |
  651|      1|	vobject_class->nickname = "embed";
  652|      1|	vobject_class->description = _("embed an image in a larger image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  653|      1|	vobject_class->build = vips_embed_build;
  654|       |
  655|      1|	VIPS_ARG_INT(class, "x", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  656|      1|		_("x"),
  657|      1|		_("Left edge of input in output"),
  658|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  659|      1|		G_STRUCT_OFFSET(VipsEmbed, x),
  660|      1|		-1000000000, 1000000000, 0);
  661|       |
  662|      1|	VIPS_ARG_INT(class, "y", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  663|      1|		_("y"),
  664|      1|		_("Top edge of input in output"),
  665|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  666|      1|		G_STRUCT_OFFSET(VipsEmbed, y),
  667|      1|		-1000000000, 1000000000, 0);
  668|      1|}
embed.c:vips_gravity_class_init:
  796|      1|{
  797|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  798|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  799|       |
  800|      1|	VIPS_DEBUG_MSG("vips_gravity_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  801|       |
  802|      1|	gobject_class->set_property = vips_object_set_property;
  803|      1|	gobject_class->get_property = vips_object_get_property;
  804|       |
  805|      1|	vobject_class->nickname = "gravity";
  806|      1|	vobject_class->description = _("place an image within a larger "
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  807|      1|								   "image with a certain gravity");
  808|      1|	vobject_class->build = vips_gravity_build;
  809|       |
  810|      1|	VIPS_ARG_ENUM(class, "direction", 3,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  811|      1|		_("Direction"),
  812|      1|		_("Direction to place image within width/height"),
  813|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  814|      1|		G_STRUCT_OFFSET(VipsGravity, direction),
  815|      1|		VIPS_TYPE_COMPASS_DIRECTION, VIPS_COMPASS_DIRECTION_CENTRE);
  816|      1|}

vips_extract_area:
  260|  1.14k|{
  261|  1.14k|	va_list ap;
  262|  1.14k|	int result;
  263|       |
  264|  1.14k|	va_start(ap, height);
  265|  1.14k|	result = vips_call_split("extract_area", ap, in, out,
  266|  1.14k|		left, top, width, height);
  267|  1.14k|	va_end(ap);
  268|       |
  269|  1.14k|	return result;
  270|  1.14k|}
vips_crop_get_type:
  277|      2|{
  278|      2|	static gsize gtype_id = 0;
  279|       |
  280|      2|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 2, False: 0]
  |  |  ------------------
  |  |  249|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|      2|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|      2|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|      4|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|      4|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|      4|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|      4|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|      4|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|      4|    gapg_temp_newval;                                                        \
  |  |  |  |  131|      4|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 2, False: 0]
  |  |  ------------------
  |  |  252|      2|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 2, False: 0]
  |  |  ------------------
  |  |  253|      2|  }))
  ------------------
  281|      2|		GType new_type = g_type_register_static_simple(VIPS_TYPE_CONVERSION,
  ------------------
  |  |   38|      2|#define VIPS_TYPE_CONVERSION (vips_conversion_get_type())
  ------------------
  282|      2|			g_intern_static_string("crop"),
  283|      2|			sizeof(VipsExtractAreaClass),
  284|      2|			(GClassInitFunc) (void (*)(void)) vips_extract_area_class_intern_init,
  285|      2|			sizeof(VipsExtractArea),
  286|       |#ifdef __EMSCRIPTEN__
  287|       |			(GInstanceInitFunc) vips_crop_init_adapter,
  288|       |#else
  289|      2|			(GInstanceInitFunc) (void (*)(void)) vips_extract_area_init,
  290|      2|#endif
  291|      2|			(GTypeFlags) 0);
  292|       |
  293|      2|		g_once_init_leave(&gtype_id, new_type);
  ------------------
  |  |  255|      2|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  256|      2|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|      2|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  257|      2|    0 ? (void) (*(location) = (result)) : (void) 0;                  \
  |  |  ------------------
  |  |  |  Branch (257:5): [Folded - Ignored]
  |  |  ------------------
  |  |  258|      2|    g_once_init_leave ((location), (gsize) (result));                \
  |  |  259|      2|  }))
  ------------------
  294|      2|	}
  295|       |
  296|      2|	return (GType) gtype_id;
  297|      2|}
vips_extract_band:
  479|  1.13k|{
  480|  1.13k|	va_list ap;
  481|  1.13k|	int result;
  482|       |
  483|  1.13k|	va_start(ap, band);
  484|  1.13k|	result = vips_call_split("extract_band", ap, in, out, band);
  485|  1.13k|	va_end(ap);
  486|       |
  487|  1.13k|	return result;
  488|  1.13k|}
extract.c:vips_extract_area_class_init:
  177|      2|{
  178|      2|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      2|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  179|      2|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      2|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|      2|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      2|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      2|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  181|       |
  182|      2|	VIPS_DEBUG_MSG("vips_extract_area_class_init\n");
  ------------------
  |  |   47|      2|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      2|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      2|	{ \
  |  |   49|      2|		; \
  |  |   50|      2|	} \
  |  |   51|      2|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      2|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  183|       |
  184|      2|	gobject_class->set_property = vips_object_set_property;
  185|      2|	gobject_class->get_property = vips_object_get_property;
  186|       |
  187|      2|	vobject_class->nickname = "extract_area";
  188|      2|	vobject_class->description = _("extract an area from an image");
  ------------------
  |  |   30|      2|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      2|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  189|      2|	vobject_class->build = vips_extract_area_build;
  190|       |
  191|      2|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  192|       |
  193|      2|	VIPS_ARG_IMAGE(class, "input", 1,
  ------------------
  |  |  112|      2|	{ \
  |  |  113|      2|		GParamSpec *pspec; \
  |  |  114|      2|\
  |  |  115|      2|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      2|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      2|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      2|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      2|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      2|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      2|			vips_argument_get_id(), pspec); \
  |  |  120|      2|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      2|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      2|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      2|	}
  ------------------
  194|      2|		_("Input"),
  195|      2|		_("Input image"),
  196|      2|		VIPS_ARGUMENT_REQUIRED_INPUT,
  197|      2|		G_STRUCT_OFFSET(VipsExtractArea, in));
  198|       |
  199|      2|	VIPS_ARG_INT(class, "left", 3,
  ------------------
  |  |  184|      2|	{ \
  |  |  185|      2|		GParamSpec *pspec; \
  |  |  186|      2|\
  |  |  187|      2|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      2|			(MIN), (MAX), (VALUE), \
  |  |  189|      2|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      2|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      2|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      2|			vips_argument_get_id(), pspec); \
  |  |  192|      2|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      2|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      2|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      2|	}
  ------------------
  200|      2|		_("Left"),
  201|      2|		_("Left edge of extract area"),
  202|      2|		VIPS_ARGUMENT_REQUIRED_INPUT,
  203|      2|		G_STRUCT_OFFSET(VipsExtractArea, left),
  204|      2|		-VIPS_MAX_COORD, VIPS_MAX_COORD, 0);
  205|       |
  206|      2|	VIPS_ARG_INT(class, "top", 4,
  ------------------
  |  |  184|      2|	{ \
  |  |  185|      2|		GParamSpec *pspec; \
  |  |  186|      2|\
  |  |  187|      2|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      2|			(MIN), (MAX), (VALUE), \
  |  |  189|      2|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      2|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      2|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      2|			vips_argument_get_id(), pspec); \
  |  |  192|      2|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      2|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      2|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      2|	}
  ------------------
  207|      2|		_("Top"),
  208|      2|		_("Top edge of extract area"),
  209|      2|		VIPS_ARGUMENT_REQUIRED_INPUT,
  210|      2|		G_STRUCT_OFFSET(VipsExtractArea, top),
  211|      2|		-VIPS_MAX_COORD, VIPS_MAX_COORD, 0);
  212|       |
  213|      2|	VIPS_ARG_INT(class, "width", 5,
  ------------------
  |  |  184|      2|	{ \
  |  |  185|      2|		GParamSpec *pspec; \
  |  |  186|      2|\
  |  |  187|      2|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      2|			(MIN), (MAX), (VALUE), \
  |  |  189|      2|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      2|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      2|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      2|			vips_argument_get_id(), pspec); \
  |  |  192|      2|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      2|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      2|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      2|	}
  ------------------
  214|      2|		_("Width"),
  215|      2|		_("Width of extract area"),
  216|      2|		VIPS_ARGUMENT_REQUIRED_INPUT,
  217|      2|		G_STRUCT_OFFSET(VipsExtractArea, width),
  218|      2|		1, VIPS_MAX_COORD, 1);
  219|       |
  220|      2|	VIPS_ARG_INT(class, "height", 6,
  ------------------
  |  |  184|      2|	{ \
  |  |  185|      2|		GParamSpec *pspec; \
  |  |  186|      2|\
  |  |  187|      2|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      2|			(MIN), (MAX), (VALUE), \
  |  |  189|      2|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      2|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      2|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      2|			vips_argument_get_id(), pspec); \
  |  |  192|      2|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      2|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      2|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      2|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      2|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      2|	}
  ------------------
  221|      2|		_("Height"),
  222|      2|		_("Height of extract area"),
  223|      2|		VIPS_ARGUMENT_REQUIRED_INPUT,
  224|      2|		G_STRUCT_OFFSET(VipsExtractArea, height),
  225|      2|		1, VIPS_MAX_COORD, 1);
  226|      2|}
extract.c:vips_extract_area_build:
  138|  1.14k|{
  139|  1.14k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  1.14k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  1.14k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  1.14k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  140|  1.14k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  1.14k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  1.14k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.14k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  1.14k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  141|  1.14k|	VipsExtractArea *extract = (VipsExtractArea *) object;
  142|       |
  143|  1.14k|	if (VIPS_OBJECT_CLASS(vips_extract_area_parent_class)->build(object))
  ------------------
  |  |  435|  1.14k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.14k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.14k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (143:6): [True: 0, False: 1.14k]
  ------------------
  144|      0|		return -1;
  145|       |
  146|  1.14k|	if (extract->left + extract->width > extract->in->Xsize ||
  ------------------
  |  Branch (146:6): [True: 0, False: 1.14k]
  ------------------
  147|  1.14k|		extract->top + extract->height > extract->in->Ysize ||
  ------------------
  |  Branch (147:3): [True: 0, False: 1.14k]
  ------------------
  148|  1.14k|		extract->left < 0 || extract->top < 0 ||
  ------------------
  |  Branch (148:3): [True: 0, False: 1.14k]
  |  Branch (148:24): [True: 0, False: 1.14k]
  ------------------
  149|  1.14k|		extract->width <= 0 || extract->height <= 0) {
  ------------------
  |  Branch (149:3): [True: 0, False: 1.14k]
  |  Branch (149:26): [True: 0, False: 1.14k]
  ------------------
  150|      0|		vips_error(class->nickname, "%s", _("bad extract area"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  151|      0|		return -1;
  152|      0|	}
  153|       |
  154|  1.14k|	if (vips_image_pio_input(extract->in) ||
  ------------------
  |  Branch (154:6): [True: 0, False: 1.14k]
  ------------------
  155|  1.14k|		vips_check_coding_known(class->nickname, extract->in))
  ------------------
  |  Branch (155:3): [True: 0, False: 1.14k]
  ------------------
  156|      0|		return -1;
  157|       |
  158|  1.14k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (158:6): [True: 0, False: 1.14k]
  ------------------
  159|  1.14k|			VIPS_DEMAND_STYLE_THINSTRIP, extract->in, NULL))
  160|      0|		return -1;
  161|       |
  162|  1.14k|	conversion->out->Xsize = extract->width;
  163|  1.14k|	conversion->out->Ysize = extract->height;
  164|  1.14k|	conversion->out->Xoffset = -extract->left;
  165|  1.14k|	conversion->out->Yoffset = -extract->top;
  166|       |
  167|  1.14k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (167:6): [True: 0, False: 1.14k]
  ------------------
  168|  1.14k|			vips_start_one, vips_extract_area_gen, vips_stop_one,
  169|  1.14k|			extract->in, extract))
  170|      0|		return -1;
  171|       |
  172|  1.14k|	return 0;
  173|  1.14k|}
extract.c:vips_extract_area_gen:
  113|  4.99k|{
  114|  4.99k|	VipsRegion *ir = (VipsRegion *) seq;
  115|  4.99k|	VipsExtractArea *extract = (VipsExtractArea *) b;
  116|  4.99k|	VipsRect iarea;
  117|       |
  118|       |	/* Ask for input we need. Translate from demand in or's space to
  119|       |	 * demand in ir's space.
  120|       |	 */
  121|  4.99k|	iarea = out_region->valid;
  122|  4.99k|	iarea.left += extract->left;
  123|  4.99k|	iarea.top += extract->top;
  124|  4.99k|	if (vips_region_prepare(ir, &iarea))
  ------------------
  |  Branch (124:6): [True: 260, False: 4.73k]
  ------------------
  125|    260|		return -1;
  126|       |
  127|       |	/* Attach or to ir.
  128|       |	 */
  129|  4.73k|	if (vips_region_region(out_region, ir,
  ------------------
  |  Branch (129:6): [True: 0, False: 4.73k]
  ------------------
  130|  4.73k|			&out_region->valid, iarea.left, iarea.top))
  131|      0|		return -1;
  132|       |
  133|  4.73k|	return 0;
  134|  4.73k|}
extract.c:vips_extract_area_init:
  238|  1.14k|{
  239|  1.14k|}
extract.c:vips_extract_band_class_init:
  415|      1|{
  416|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  417|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  418|      1|	VipsBandaryClass *bandary_class = VIPS_BANDARY_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_BANDARY, VipsBandaryClass))
  ------------------
  419|       |
  420|      1|	VIPS_DEBUG_MSG("vips_extract_band_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  421|       |
  422|      1|	gobject_class->set_property = vips_object_set_property;
  423|      1|	gobject_class->get_property = vips_object_get_property;
  424|       |
  425|      1|	vobject_class->nickname = "extract_band";
  426|      1|	vobject_class->description = _("extract band from an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  427|      1|	vobject_class->build = vips_extract_band_build;
  428|       |
  429|      1|	bandary_class->process_line = vips_extract_band_buffer;
  430|       |
  431|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  432|      1|		_("Input"),
  433|      1|		_("Input image"),
  434|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  435|      1|		G_STRUCT_OFFSET(VipsExtractBand, in));
  436|       |
  437|      1|	VIPS_ARG_INT(class, "band", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  438|      1|		_("Band"),
  439|      1|		_("Band to extract"),
  440|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  441|      1|		G_STRUCT_OFFSET(VipsExtractBand, band),
  442|      1|		0, VIPS_MAX_COORD, 0);
  443|       |
  444|      1|	VIPS_ARG_INT(class, "n", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  445|      1|		_("n"),
  446|      1|		_("Number of bands to extract"),
  447|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  448|      1|		G_STRUCT_OFFSET(VipsExtractBand, n),
  449|      1|		1, VIPS_MAX_COORD, 1);
  450|      1|}
extract.c:vips_extract_band_build:
  382|  1.13k|{
  383|  1.13k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  1.13k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  1.13k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  1.13k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  384|  1.13k|	VipsBandary *bandary = (VipsBandary *) object;
  385|  1.13k|	VipsExtractBand *extract = (VipsExtractBand *) object;
  386|       |
  387|  1.13k|	if (extract->in) {
  ------------------
  |  Branch (387:6): [True: 1.13k, False: 0]
  ------------------
  388|  1.13k|		int bands;
  389|       |
  390|  1.13k|		vips_image_decode_predict(extract->in, &bands, NULL);
  391|       |
  392|  1.13k|		bandary->n = 1;
  393|  1.13k|		bandary->in = &extract->in;
  394|  1.13k|		bandary->out_bands = extract->n;
  395|       |
  396|  1.13k|		if (extract->band + extract->n > bands) {
  ------------------
  |  Branch (396:7): [True: 0, False: 1.13k]
  ------------------
  397|      0|			vips_error(class->nickname,
  398|      0|				"%s", _("bad extract band"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  399|      0|			return -1;
  400|      0|		}
  401|       |
  402|  1.13k|		if (extract->band == 0 &&
  ------------------
  |  Branch (402:7): [True: 678, False: 460]
  ------------------
  403|  1.13k|			extract->n == bands)
  ------------------
  |  Branch (403:4): [True: 0, False: 678]
  ------------------
  404|      0|			return vips_bandary_copy(bandary);
  405|  1.13k|	}
  406|       |
  407|  1.13k|	if (VIPS_OBJECT_CLASS(vips_extract_band_parent_class)->build(object))
  ------------------
  |  |  435|  1.13k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.13k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.13k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (407:6): [True: 0, False: 1.13k]
  ------------------
  408|      0|		return -1;
  409|       |
  410|  1.13k|	return 0;
  411|  1.13k|}
extract.c:vips_extract_band_buffer:
  348|  32.9k|{
  349|  32.9k|	VipsBandary *bandary = seq->bandary;
  350|  32.9k|	VipsConversion *conversion = (VipsConversion *) bandary;
  351|  32.9k|	VipsExtractBand *extract = (VipsExtractBand *) bandary;
  352|  32.9k|	VipsImage *im = bandary->ready[0];
  353|  32.9k|	int es = VIPS_IMAGE_SIZEOF_ELEMENT(im);
  ------------------
  |  |  382|  32.9k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  ------------------
  354|  32.9k|	int ips = VIPS_IMAGE_SIZEOF_PEL(im);
  ------------------
  |  |  384|  32.9k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  32.9k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  355|  32.9k|	const int ops = VIPS_IMAGE_SIZEOF_PEL(conversion->out);
  ------------------
  |  |  384|  32.9k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  32.9k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  356|       |
  357|  32.9k|	VipsPel *restrict p;
  358|  32.9k|	VipsPel *restrict q;
  359|  32.9k|	int x, z;
  360|       |
  361|  32.9k|	p = in[0] + extract->band * es;
  362|  32.9k|	q = out;
  363|  32.9k|	if (ops == 1) {
  ------------------
  |  Branch (363:6): [True: 4.66k, False: 28.2k]
  ------------------
  364|   266k|		for (x = 0; x < width; x++) {
  ------------------
  |  Branch (364:15): [True: 261k, False: 4.66k]
  ------------------
  365|   261k|			q[x] = p[0];
  366|   261k|			p += ips;
  367|   261k|		}
  368|  4.66k|	}
  369|  28.2k|	else {
  370|   761k|		for (x = 0; x < width; x++) {
  ------------------
  |  Branch (370:15): [True: 733k, False: 28.2k]
  ------------------
  371|  4.86M|			for (z = 0; z < ops; z++)
  ------------------
  |  Branch (371:16): [True: 4.13M, False: 733k]
  ------------------
  372|  4.13M|				q[z] = p[z];
  373|       |
  374|   733k|			p += ips;
  375|   733k|			q += ops;
  376|   733k|		}
  377|  28.2k|	}
  378|  32.9k|}
extract.c:vips_extract_band_init:
  454|  1.13k|{
  455|  1.13k|	extract->n = 1;
  456|  1.13k|}

falsecolour.c:vips_falsecolour_class_init:
  365|      1|{
  366|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  367|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  368|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  369|       |
  370|      1|	gobject_class->set_property = vips_object_set_property;
  371|      1|	gobject_class->get_property = vips_object_get_property;
  372|       |
  373|      1|	vobject_class->nickname = "falsecolour";
  374|      1|	vobject_class->description = _("false-color an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  375|      1|	vobject_class->build = vips_falsecolour_build;
  376|       |
  377|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  378|       |
  379|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  380|      1|		_("Input"),
  381|      1|		_("Input image"),
  382|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  383|      1|		G_STRUCT_OFFSET(VipsFalsecolour, in));
  384|      1|}

flatten.c:vips_flatten_class_init:
  402|      1|{
  403|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  404|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  405|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  406|       |
  407|      1|	VIPS_DEBUG_MSG("vips_flatten_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  408|       |
  409|      1|	gobject_class->set_property = vips_object_set_property;
  410|      1|	gobject_class->get_property = vips_object_get_property;
  411|       |
  412|      1|	vobject_class->nickname = "flatten";
  413|      1|	vobject_class->description = _("flatten alpha out of an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  414|      1|	vobject_class->build = vips_flatten_build;
  415|       |
  416|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  417|       |
  418|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  419|      1|		_("Input"),
  420|      1|		_("Input image"),
  421|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  422|      1|		G_STRUCT_OFFSET(VipsFlatten, in));
  423|       |
  424|      1|	VIPS_ARG_BOXED(class, "background", 2,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  425|      1|		_("Background"),
  426|      1|		_("Background value"),
  427|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  428|      1|		G_STRUCT_OFFSET(VipsFlatten, background),
  429|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  430|       |
  431|      1|	VIPS_ARG_DOUBLE(class, "max_alpha", 115,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  432|      1|		_("Maximum alpha"),
  433|      1|		_("Maximum value of alpha channel"),
  434|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  435|      1|		G_STRUCT_OFFSET(VipsFlatten, max_alpha),
  436|      1|		0, 100000000, 255);
  437|      1|}

flip.c:vips_flip_class_init:
  226|      1|{
  227|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  228|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  229|       |
  230|      1|	VIPS_DEBUG_MSG("vips_flip_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|       |
  232|      1|	gobject_class->set_property = vips_object_set_property;
  233|      1|	gobject_class->get_property = vips_object_get_property;
  234|       |
  235|      1|	vobject_class->nickname = "flip";
  236|      1|	vobject_class->description = _("flip an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  237|      1|	vobject_class->build = vips_flip_build;
  238|       |
  239|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  240|      1|		_("Input"),
  241|      1|		_("Input image"),
  242|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  243|      1|		G_STRUCT_OFFSET(VipsFlip, in));
  244|       |
  245|      1|	VIPS_ARG_ENUM(class, "direction", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  246|      1|		_("Direction"),
  247|      1|		_("Direction to flip image"),
  248|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  249|      1|		G_STRUCT_OFFSET(VipsFlip, direction),
  250|      1|		VIPS_TYPE_DIRECTION, VIPS_DIRECTION_HORIZONTAL);
  251|      1|}

gamma.c:vips_gamma_class_init:
  127|      1|{
  128|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  129|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  130|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  131|       |
  132|      1|	gobject_class->set_property = vips_object_set_property;
  133|      1|	gobject_class->get_property = vips_object_get_property;
  134|       |
  135|      1|	vobject_class->nickname = "gamma";
  136|      1|	vobject_class->description = _("gamma an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  137|      1|	vobject_class->build = vips_gamma_build;
  138|       |
  139|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  140|       |
  141|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  142|      1|		_("Input"),
  143|      1|		_("Input image"),
  144|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  145|      1|		G_STRUCT_OFFSET(VipsGamma, in));
  146|       |
  147|      1|	VIPS_ARG_DOUBLE(class, "exponent", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  148|      1|		_("Exponent"),
  149|      1|		_("Gamma factor"),
  150|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  151|      1|		G_STRUCT_OFFSET(VipsGamma, exponent),
  152|      1|		0.000001, 1000.0, 1.0 / 2.4);
  153|      1|}

grid.c:vips_grid_class_init:
  187|      1|{
  188|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  190|       |
  191|      1|	gobject_class->set_property = vips_object_set_property;
  192|      1|	gobject_class->get_property = vips_object_get_property;
  193|       |
  194|      1|	vobject_class->nickname = "grid";
  195|      1|	vobject_class->description = _("grid an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  196|      1|	vobject_class->build = vips_grid_build;
  197|       |
  198|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  199|      1|		_("Input"),
  200|      1|		_("Input image"),
  201|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  202|      1|		G_STRUCT_OFFSET(VipsGrid, in));
  203|       |
  204|      1|	VIPS_ARG_INT(class, "tile_height", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  205|      1|		_("Tile height"),
  206|      1|		_("Chop into tiles this high"),
  207|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  208|      1|		G_STRUCT_OFFSET(VipsGrid, tile_height),
  209|      1|		1, 10000000, 128);
  210|       |
  211|      1|	VIPS_ARG_INT(class, "across", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  212|      1|		_("Across"),
  213|      1|		_("Number of tiles across"),
  214|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  215|      1|		G_STRUCT_OFFSET(VipsGrid, across),
  216|      1|		1, 10000000, 1);
  217|       |
  218|      1|	VIPS_ARG_INT(class, "down", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  219|      1|		_("Down"),
  220|      1|		_("Number of tiles down"),
  221|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  222|      1|		G_STRUCT_OFFSET(VipsGrid, down),
  223|      1|		1, 10000000, 1);
  224|      1|}

ifthenelse.c:vips_ifthenelse_class_init:
  515|      1|{
  516|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  517|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  518|       |
  519|      1|	VIPS_DEBUG_MSG("vips_ifthenelse_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|       |
  521|      1|	gobject_class->set_property = vips_object_set_property;
  522|      1|	gobject_class->get_property = vips_object_get_property;
  523|       |
  524|      1|	vobject_class->nickname = "ifthenelse";
  525|      1|	vobject_class->description = _("ifthenelse an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  526|      1|	vobject_class->build = vips_ifthenelse_build;
  527|       |
  528|      1|	VIPS_ARG_IMAGE(class, "cond", -2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  529|      1|		_("Condition"),
  530|      1|		_("Condition input image"),
  531|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  532|      1|		G_STRUCT_OFFSET(VipsIfthenelse, cond));
  533|       |
  534|      1|	VIPS_ARG_IMAGE(class, "in1", -1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  535|      1|		_("Then image"),
  536|      1|		_("Source for TRUE pixels"),
  537|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  538|      1|		G_STRUCT_OFFSET(VipsIfthenelse, in1));
  539|       |
  540|      1|	VIPS_ARG_IMAGE(class, "in2", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  541|      1|		_("Else image"),
  542|      1|		_("Source for FALSE pixels"),
  543|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  544|      1|		G_STRUCT_OFFSET(VipsIfthenelse, in2));
  545|       |
  546|      1|	VIPS_ARG_BOOL(class, "blend", 4,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  547|      1|		_("Blend"),
  548|      1|		_("Blend smoothly between then and else parts"),
  549|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  550|      1|		G_STRUCT_OFFSET(VipsIfthenelse, blend),
  551|      1|		FALSE);
  552|      1|}

vips__vector_to_pels:
  248|  8.75k|{
  249|       |	/* Run our pipeline relative to this.
  250|       |	 */
  251|  8.75k|	VipsImage *context = vips_image_new();
  252|       |
  253|  8.75k|	VipsImage **t = (VipsImage **)
  254|  8.75k|		vips_object_local_array(VIPS_OBJECT(context), 8);
  ------------------
  |  |  433|  8.75k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  8.75k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  8.75k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  255|       |
  256|  8.75k|	VipsImage *in;
  257|  8.75k|	double *ones;
  258|  8.75k|	VipsPel *result;
  259|  8.75k|	int i;
  260|       |
  261|       |#ifdef VIPS_DEBUG
  262|       |	printf("vips__vector_to_pels: starting\n");
  263|       |#endif /*VIPS_DEBUG*/
  264|       |
  265|  8.75k|	ones = VIPS_ARRAY(context, n, double);
  ------------------
  |  |   72|  8.75k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  8.75k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  8.75k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  8.75k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  8.75k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  266|  17.5k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (266:14): [True: 8.75k, False: 8.75k]
  ------------------
  267|  8.75k|		ones[i] = 1.0;
  268|       |
  269|       |	/* Make the real and imaginary parts.
  270|       |	 */
  271|  8.75k|	if (vips_black(&t[0], 1, 1, "bands", bands, NULL) ||
  ------------------
  |  Branch (271:6): [True: 0, False: 8.75k]
  ------------------
  272|  8.75k|		vips_linear(t[0], &t[1], ones, real, n, NULL)) {
  ------------------
  |  Branch (272:3): [True: 0, False: 8.75k]
  ------------------
  273|      0|		g_object_unref(context);
  274|      0|		return NULL;
  275|      0|	}
  276|  8.75k|	in = t[1];
  277|       |
  278|  8.75k|	if (imag) {
  ------------------
  |  Branch (278:6): [True: 0, False: 8.75k]
  ------------------
  279|      0|		if (vips_black(&t[2], 1, 1, "bands", bands, NULL) ||
  ------------------
  |  Branch (279:7): [True: 0, False: 0]
  ------------------
  280|      0|			vips_linear(t[2], &t[3], ones, imag, n, NULL) ||
  ------------------
  |  Branch (280:4): [True: 0, False: 0]
  ------------------
  281|      0|			vips_complexform(in, t[3], &t[4], NULL)) {
  ------------------
  |  Branch (281:4): [True: 0, False: 0]
  ------------------
  282|      0|			g_object_unref(context);
  283|      0|			return NULL;
  284|      0|		}
  285|      0|		in = t[4];
  286|      0|	}
  287|       |
  288|       |	/* Cast to the output type and coding.
  289|       |	 */
  290|  8.75k|	if (vips_cast(in, &t[5], format, NULL) ||
  ------------------
  |  Branch (290:6): [True: 0, False: 8.75k]
  ------------------
  291|  8.75k|		vips_image_encode(t[5], &t[6], coding)) {
  ------------------
  |  Branch (291:3): [True: 0, False: 8.75k]
  ------------------
  292|      0|		g_object_unref(context);
  293|      0|		return NULL;
  294|      0|	}
  295|  8.75k|	in = t[6];
  296|       |
  297|       |	/* Write to memory, copy to output buffer.
  298|       |	 */
  299|  8.75k|	vips_image_set_int(in, "hide-progress", 1);
  300|  8.75k|	if (!(t[7] = vips_image_new_memory()) ||
  ------------------
  |  Branch (300:6): [True: 0, False: 8.75k]
  ------------------
  301|  8.75k|		vips_image_write(in, t[7])) {
  ------------------
  |  Branch (301:3): [True: 0, False: 8.75k]
  ------------------
  302|      0|		g_object_unref(context);
  303|      0|		return NULL;
  304|      0|	}
  305|  8.75k|	in = t[7];
  306|       |
  307|  8.75k|	if (!(result =
  ------------------
  |  Branch (307:6): [True: 0, False: 8.75k]
  ------------------
  308|  8.75k|				VIPS_ARRAY(NULL, VIPS_IMAGE_SIZEOF_PEL(in), VipsPel))) {
  ------------------
  |  |   72|  8.75k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  8.75k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  8.75k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  8.75k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  8.75k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  309|      0|		g_object_unref(context);
  310|      0|		return NULL;
  311|      0|	}
  312|       |
  313|  8.75k|	memcpy(result, in->data, VIPS_IMAGE_SIZEOF_PEL(in));
  ------------------
  |  |  384|  8.75k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  8.75k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  314|       |
  315|       |#ifdef VIPS_DEBUG
  316|       |	{
  317|       |		int i;
  318|       |
  319|       |		printf("vips__vector_to_ink:\n");
  320|       |		printf("\t(real, imag) = ");
  321|       |		for (i = 0; i < n; i++)
  322|       |			printf("(%g, %g) ", real[i], imag ? imag[i] : 0);
  323|       |		printf("\n");
  324|       |		printf("\tink = ");
  325|       |		for (i = 0; i < VIPS_IMAGE_SIZEOF_PEL(in); i++)
  326|       |			printf("%d ", result[i]);
  327|       |		printf("\n");
  328|       |	}
  329|       |#endif /*VIPS_DEBUG*/
  330|       |
  331|  8.75k|	g_object_unref(context);
  332|       |
  333|  8.75k|	return result;
  334|  8.75k|}
vips__vector_to_ink:
  348|      9|{
  349|      9|	int bands;
  350|      9|	VipsBandFormat format;
  351|      9|	VipsPel *result;
  352|       |
  353|      9|	vips_image_decode_predict(im, &bands, &format);
  354|       |
  355|      9|	if (!(result = vips__vector_to_pels(domain,
  ------------------
  |  Branch (355:6): [True: 0, False: 9]
  ------------------
  356|      9|			  bands, format, im->Coding, real, imag, n)))
  357|      0|		return NULL;
  358|       |
  359|      9|	g_signal_connect(im, "postclose",
  ------------------
  |  |  491|      9|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  360|      9|		G_CALLBACK(vips__vector_to_ink_cb), result);
  361|       |
  362|      9|	return result;
  363|      9|}
insert.c:vips_insert_class_init:
  448|      1|{
  449|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  450|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  451|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  452|       |
  453|      1|	VIPS_DEBUG_MSG("vips_insert_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  454|       |
  455|      1|	gobject_class->set_property = vips_object_set_property;
  456|      1|	gobject_class->get_property = vips_object_get_property;
  457|       |
  458|      1|	vobject_class->nickname = "insert";
  459|      1|	vobject_class->description =
  460|      1|		_("insert image @sub into @main at @x, @y");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  461|      1|	vobject_class->build = vips_insert_build;
  462|       |
  463|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  464|       |
  465|      1|	VIPS_ARG_IMAGE(class, "main", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  466|      1|		_("Main"),
  467|      1|		_("Main input image"),
  468|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  469|      1|		G_STRUCT_OFFSET(VipsInsert, main));
  470|       |
  471|      1|	VIPS_ARG_IMAGE(class, "sub", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  472|      1|		_("Sub-image"),
  473|      1|		_("Sub-image to insert into main image"),
  474|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  475|      1|		G_STRUCT_OFFSET(VipsInsert, sub));
  476|       |
  477|      1|	VIPS_ARG_INT(class, "x", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  478|      1|		_("X"),
  479|      1|		_("Left edge of sub in main"),
  480|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  481|      1|		G_STRUCT_OFFSET(VipsInsert, x),
  482|      1|		-VIPS_MAX_COORD, VIPS_MAX_COORD, 0);
  483|       |
  484|      1|	VIPS_ARG_INT(class, "y", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  485|      1|		_("Y"),
  486|      1|		_("Top edge of sub in main"),
  487|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  488|      1|		G_STRUCT_OFFSET(VipsInsert, y),
  489|      1|		-VIPS_MAX_COORD, VIPS_MAX_COORD, 0);
  490|       |
  491|      1|	VIPS_ARG_BOOL(class, "expand", 5,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  492|      1|		_("Expand"),
  493|      1|		_("Expand output to hold all of both inputs"),
  494|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  495|      1|		G_STRUCT_OFFSET(VipsInsert, expand),
  496|      1|		FALSE);
  497|       |
  498|      1|	VIPS_ARG_BOXED(class, "background", 6,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  499|      1|		_("Background"),
  500|      1|		_("Color for new pixels"),
  501|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  502|      1|		G_STRUCT_OFFSET(VipsInsert, background),
  503|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  504|      1|}
insert.c:vips__vector_to_ink_cb:
  338|      9|{
  339|      9|	g_free(buf);
  340|      9|}

join.c:vips_join_class_init:
  220|      1|{
  221|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  222|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  223|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  224|       |
  225|      1|	VIPS_DEBUG_MSG("vips_join_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  226|       |
  227|      1|	gobject_class->set_property = vips_object_set_property;
  228|      1|	gobject_class->get_property = vips_object_get_property;
  229|       |
  230|      1|	vobject_class->nickname = "join";
  231|      1|	vobject_class->description = _("join a pair of images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  232|      1|	vobject_class->build = vips_join_build;
  233|       |
  234|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  235|       |
  236|      1|	VIPS_ARG_IMAGE(class, "in1", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  237|      1|		_("in1"),
  238|      1|		_("First input image"),
  239|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  240|      1|		G_STRUCT_OFFSET(VipsJoin, in1));
  241|       |
  242|      1|	VIPS_ARG_IMAGE(class, "in2", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  243|      1|		_("in2"),
  244|      1|		_("Second input image"),
  245|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  246|      1|		G_STRUCT_OFFSET(VipsJoin, in2));
  247|       |
  248|      1|	VIPS_ARG_ENUM(class, "direction", 3,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  249|      1|		_("Direction"),
  250|      1|		_("Join left-right or up-down"),
  251|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  252|      1|		G_STRUCT_OFFSET(VipsJoin, direction),
  253|      1|		VIPS_TYPE_DIRECTION, VIPS_DIRECTION_HORIZONTAL);
  254|       |
  255|      1|	VIPS_ARG_BOOL(class, "expand", 4,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  256|      1|		_("Expand"),
  257|      1|		_("Expand output to hold all of both inputs"),
  258|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  259|      1|		G_STRUCT_OFFSET(VipsJoin, expand),
  260|      1|		FALSE);
  261|       |
  262|      1|	VIPS_ARG_INT(class, "shim", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  263|      1|		_("Shim"),
  264|      1|		_("Pixels between images"),
  265|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  266|      1|		G_STRUCT_OFFSET(VipsJoin, shim),
  267|      1|		0, 1000000, 0);
  268|       |
  269|      1|	VIPS_ARG_BOXED(class, "background", 6,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  270|      1|		_("Background"),
  271|      1|		_("Colour for new pixels"),
  272|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  273|      1|		G_STRUCT_OFFSET(VipsJoin, background),
  274|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  275|       |
  276|      1|	VIPS_ARG_ENUM(class, "align", 7,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  277|      1|		_("Align"),
  278|      1|		_("Align on the low, centre or high coordinate edge"),
  279|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  280|      1|		G_STRUCT_OFFSET(VipsJoin, align),
  281|      1|		VIPS_TYPE_ALIGN, VIPS_ALIGN_LOW);
  282|      1|}

msb.c:vips_msb_class_init:
  231|      1|{
  232|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  233|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  234|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  235|       |
  236|      1|	gobject_class->set_property = vips_object_set_property;
  237|      1|	gobject_class->get_property = vips_object_get_property;
  238|       |
  239|      1|	vobject_class->nickname = "msb";
  240|      1|	vobject_class->description =
  241|      1|		_("pick most-significant byte from an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  242|      1|	vobject_class->build = vips_msb_build;
  243|       |
  244|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  245|       |
  246|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  247|      1|		_("Input"),
  248|      1|		_("Input image"),
  249|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  250|      1|		G_STRUCT_OFFSET(VipsMsb, in));
  251|       |
  252|      1|	VIPS_ARG_INT(class, "band", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  253|      1|		_("Band"),
  254|      1|		_("Band to msb"),
  255|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  256|      1|		G_STRUCT_OFFSET(VipsMsb, band),
  257|      1|		-1, 100000000, -1);
  258|      1|}

premultiply.c:vips_premultiply_class_init:
  244|      1|{
  245|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  246|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  247|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  248|       |
  249|      1|	VIPS_DEBUG_MSG("vips_premultiply_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|       |
  251|      1|	gobject_class->set_property = vips_object_set_property;
  252|      1|	gobject_class->get_property = vips_object_get_property;
  253|       |
  254|      1|	vobject_class->nickname = "premultiply";
  255|      1|	vobject_class->description = _("premultiply image alpha");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  256|      1|	vobject_class->build = vips_premultiply_build;
  257|       |
  258|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  259|       |
  260|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  261|      1|		_("Input"),
  262|      1|		_("Input image"),
  263|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  264|      1|		G_STRUCT_OFFSET(VipsPremultiply, in));
  265|       |
  266|      1|	VIPS_ARG_DOUBLE(class, "max_alpha", 115,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  267|      1|		_("Maximum alpha"),
  268|      1|		_("Maximum value of alpha channel"),
  269|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  270|      1|		G_STRUCT_OFFSET(VipsPremultiply, max_alpha),
  271|      1|		0, 100000000, 255);
  272|      1|}

recomb.c:vips_recomb_class_init:
  209|      1|{
  210|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  211|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  212|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  213|       |
  214|      1|	gobject_class->set_property = vips_object_set_property;
  215|      1|	gobject_class->get_property = vips_object_get_property;
  216|       |
  217|      1|	object_class->nickname = "recomb";
  218|      1|	object_class->description = _("linear recombination with matrix");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  219|      1|	object_class->build = vips_recomb_build;
  220|       |
  221|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  222|       |
  223|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  224|      1|		_("Input"),
  225|      1|		_("Input image argument"),
  226|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  227|      1|		G_STRUCT_OFFSET(VipsRecomb, in));
  228|       |
  229|      1|	VIPS_ARG_IMAGE(class, "m", 102,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  230|      1|		_("M"),
  231|      1|		_("Matrix of coefficients"),
  232|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  233|      1|		G_STRUCT_OFFSET(VipsRecomb, m));
  234|      1|}

replicate.c:vips_replicate_class_init:
  182|      1|{
  183|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  184|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  185|       |
  186|      1|	VIPS_DEBUG_MSG("vips_replicate_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  187|       |
  188|      1|	gobject_class->set_property = vips_object_set_property;
  189|      1|	gobject_class->get_property = vips_object_get_property;
  190|       |
  191|      1|	vobject_class->nickname = "replicate";
  192|      1|	vobject_class->description = _("replicate an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  193|      1|	vobject_class->build = vips_replicate_build;
  194|       |
  195|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  196|      1|		_("Input"),
  197|      1|		_("Input image"),
  198|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  199|      1|		G_STRUCT_OFFSET(VipsReplicate, in));
  200|       |
  201|      1|	VIPS_ARG_INT(class, "across", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  202|      1|		_("Across"),
  203|      1|		_("Repeat this many times horizontally"),
  204|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  205|      1|		G_STRUCT_OFFSET(VipsReplicate, across),
  206|      1|		1, 1000000, 1);
  207|       |
  208|      1|	VIPS_ARG_INT(class, "down", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  209|      1|		_("Down"),
  210|      1|		_("Repeat this many times vertically"),
  211|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  212|      1|		G_STRUCT_OFFSET(VipsReplicate, down),
  213|      1|		1, 1000000, 1);
  214|      1|}

rot.c:vips_rot_class_init:
  351|      1|{
  352|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  353|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  354|       |
  355|      1|	VIPS_DEBUG_MSG("vips_rot_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  356|       |
  357|      1|	gobject_class->set_property = vips_object_set_property;
  358|      1|	gobject_class->get_property = vips_object_get_property;
  359|       |
  360|      1|	vobject_class->nickname = "rot";
  361|      1|	vobject_class->description = _("rotate an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  362|      1|	vobject_class->build = vips_rot_build;
  363|       |
  364|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  365|      1|		_("Input"),
  366|      1|		_("Input image"),
  367|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  368|      1|		G_STRUCT_OFFSET(VipsRot, in));
  369|       |
  370|      1|	VIPS_ARG_ENUM(class, "angle", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  371|      1|		_("Angle"),
  372|      1|		_("Angle to rotate image"),
  373|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  374|      1|		G_STRUCT_OFFSET(VipsRot, angle),
  375|      1|		VIPS_TYPE_ANGLE, VIPS_ANGLE_D90);
  376|      1|}

rot45.c:vips_rot45_class_init:
  254|      1|{
  255|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  257|       |
  258|      1|	VIPS_DEBUG_MSG("vips_rot45_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  259|       |
  260|      1|	gobject_class->set_property = vips_object_set_property;
  261|      1|	gobject_class->get_property = vips_object_get_property;
  262|       |
  263|      1|	vobject_class->nickname = "rot45";
  264|      1|	vobject_class->description = _("rotate an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  265|      1|	vobject_class->build = vips_rot45_build;
  266|       |
  267|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  268|      1|		_("Input"),
  269|      1|		_("Input image"),
  270|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  271|      1|		G_STRUCT_OFFSET(VipsRot45, in));
  272|       |
  273|      1|	VIPS_ARG_ENUM(class, "angle", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  274|      1|		_("Angle"),
  275|      1|		_("Angle to rotate image"),
  276|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  277|      1|		G_STRUCT_OFFSET(VipsRot45, angle),
  278|      1|		VIPS_TYPE_ANGLE45, VIPS_ANGLE45_D45);
  279|      1|}

scale.c:vips_scale_class_init:
  143|      1|{
  144|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  145|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  146|       |
  147|      1|	gobject_class->set_property = vips_object_set_property;
  148|      1|	gobject_class->get_property = vips_object_get_property;
  149|       |
  150|      1|	vobject_class->nickname = "scale";
  151|      1|	vobject_class->description = _("scale an image to uchar");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  152|      1|	vobject_class->build = vips_scale_build;
  153|       |
  154|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  155|      1|		_("Input"),
  156|      1|		_("Input image"),
  157|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  158|      1|		G_STRUCT_OFFSET(VipsScale, in));
  159|       |
  160|      1|	VIPS_ARG_BOOL(class, "log", 3,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  161|      1|		_("Log"),
  162|      1|		_("Log scale"),
  163|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  164|      1|		G_STRUCT_OFFSET(VipsScale, log),
  165|      1|		FALSE);
  166|       |
  167|      1|	VIPS_ARG_DOUBLE(class, "exp", 3,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  168|      1|		_("Exponent"),
  169|      1|		_("Exponent for log scale"),
  170|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  171|      1|		G_STRUCT_OFFSET(VipsScale, exp),
  172|      1|		0.00001, 10000, 0.25);
  173|      1|}

vips_sequential:
  303|  8.76k|{
  304|  8.76k|	va_list ap;
  305|  8.76k|	int result;
  306|       |
  307|  8.76k|	va_start(ap, out);
  308|  8.76k|	result = vips_call_split("sequential", ap, in, out);
  309|  8.76k|	va_end(ap);
  310|       |
  311|  8.76k|	return result;
  312|  8.76k|}
sequential.c:vips_sequential_class_init:
  228|      1|{
  229|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  230|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|       |
  232|      1|	VIPS_DEBUG_MSG("vips_sequential_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  233|       |
  234|      1|	gobject_class->dispose = vips_sequential_dispose;
  235|      1|	gobject_class->set_property = vips_object_set_property;
  236|      1|	gobject_class->get_property = vips_object_get_property;
  237|       |
  238|      1|	vobject_class->nickname = "sequential";
  239|      1|	vobject_class->description = _("check sequential access");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  240|      1|	vobject_class->build = vips_sequential_build;
  241|       |
  242|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  243|      1|		_("Input"),
  244|      1|		_("Input image"),
  245|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  246|      1|		G_STRUCT_OFFSET(VipsSequential, in));
  247|       |
  248|      1|	VIPS_ARG_INT(class, "tile_height", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  249|      1|		_("Tile height"),
  250|      1|		_("Tile height in pixels"),
  251|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  252|      1|		G_STRUCT_OFFSET(VipsSequential, tile_height),
  253|      1|		1, 1000000, 1);
  254|       |
  255|      1|	VIPS_ARG_ENUM(class, "access", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  256|      1|		_("Strategy"),
  257|      1|		_("Expected access pattern"),
  258|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  259|      1|		G_STRUCT_OFFSET(VipsSequential, access),
  260|      1|		VIPS_TYPE_ACCESS, VIPS_ACCESS_SEQUENTIAL);
  261|       |
  262|      1|	VIPS_ARG_BOOL(class, "trace", 2,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  263|      1|		_("Trace"),
  264|      1|		_("Trace pixel requests"),
  265|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  266|      1|		G_STRUCT_OFFSET(VipsSequential, trace),
  267|      1|		TRUE);
  268|      1|}
sequential.c:vips_sequential_dispose:
  106|  8.76k|{
  107|  8.76k|	VipsSequential *sequential = (VipsSequential *) gobject;
  108|       |
  109|  8.76k|	VIPS_FREEF(vips_g_mutex_free, sequential->lock);
  ------------------
  |  |   41|  8.76k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.76k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  8.76k|	{ \
  |  |   43|  8.76k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 8.76k, False: 0]
  |  |  ------------------
  |  |   44|  8.76k|			(void) F((S)); \
  |  |   45|  8.76k|			(S) = 0; \
  |  |   46|  8.76k|		} \
  |  |   47|  8.76k|	} \
  |  |   48|  8.76k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.76k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  110|       |
  111|  8.76k|	G_OBJECT_CLASS(vips_sequential_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  8.76k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  8.76k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  8.76k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  112|  8.76k|}
sequential.c:vips_sequential_build:
  188|  8.76k|{
  189|  8.76k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  8.76k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  8.76k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  8.76k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  8.76k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  190|  8.76k|	VipsSequential *sequential = (VipsSequential *) object;
  191|       |
  192|  8.76k|	VipsImage *t;
  193|       |
  194|  8.76k|	VIPS_DEBUG_MSG("vips_sequential_build\n");
  ------------------
  |  |   47|  8.76k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.76k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  8.76k|	{ \
  |  |   49|  8.76k|		; \
  |  |   50|  8.76k|	} \
  |  |   51|  8.76k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.76k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  195|       |
  196|  8.76k|	if (VIPS_OBJECT_CLASS(vips_sequential_parent_class)->build(object))
  ------------------
  |  |  435|  8.76k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  8.76k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  8.76k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (196:6): [True: 0, False: 8.76k]
  ------------------
  197|      0|		return -1;
  198|       |
  199|       |	/* We've gone forwards and backwards on sequential caches being
  200|       |	 * persistent. Persistent caches can be useful if you want to eg.
  201|       |	 * make several crop() operations on a seq image source, but they use
  202|       |	 * a lot of memory with eg. arrayjoin.
  203|       |	 *
  204|       |	 * On balance, if you want to make many crops from one source, use a
  205|       |	 * RANDOM image.
  206|       |	 */
  207|  8.76k|	if (vips_linecache(sequential->in, &t,
  ------------------
  |  Branch (207:6): [True: 0, False: 8.76k]
  ------------------
  208|  8.76k|			"tile_height", sequential->tile_height,
  209|  8.76k|			"access", VIPS_ACCESS_SEQUENTIAL,
  210|  8.76k|			NULL))
  211|      0|		return -1;
  212|       |
  213|  8.76k|	vips_object_local(object, t);
  ------------------
  |  |  698|  8.76k|	(g_signal_connect(V, "close", G_CALLBACK(vips_object_local_cb), G))
  |  |  ------------------
  |  |  |  |  491|  8.76k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  |  |  ------------------
  ------------------
  214|       |
  215|  8.76k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (215:6): [True: 0, False: 8.76k]
  ------------------
  216|  8.76k|			VIPS_DEMAND_STYLE_THINSTRIP, t, NULL))
  217|      0|		return -1;
  218|  8.76k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (218:6): [True: 0, False: 8.76k]
  ------------------
  219|  8.76k|			vips_start_one, vips_sequential_generate, vips_stop_one,
  220|  8.76k|			t, sequential))
  221|      0|		return -1;
  222|       |
  223|  8.76k|	return 0;
  224|  8.76k|}
sequential.c:vips_sequential_generate:
  117|  19.1k|{
  118|  19.1k|	VipsSequential *sequential = (VipsSequential *) b;
  119|  19.1k|	VipsRect *r = &out_region->valid;
  120|  19.1k|	VipsRegion *ir = (VipsRegion *) seq;
  121|       |
  122|       |	/*
  123|       |	printf("vips_sequential_generate %p: request for line %d, height %d\n",
  124|       |		sequential, r->top, r->height);
  125|       |	 */
  126|       |
  127|  19.1k|	VIPS_GATE_START("vips_sequential_generate: wait");
  ------------------
  |  |   41|  19.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  19.1k|	{ \
  |  |   43|  19.1k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 19.1k]
  |  |  ------------------
  |  |   44|  19.1k|			vips__thread_gate_start(NAME); \
  |  |   45|  19.1k|	} \
  |  |   46|  19.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  128|       |
  129|  19.1k|	vips__worker_lock(sequential->lock);
  130|       |
  131|  19.1k|	VIPS_GATE_STOP("vips_sequential_generate: wait");
  ------------------
  |  |   49|  19.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  19.1k|	{ \
  |  |   51|  19.1k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 19.1k]
  |  |  ------------------
  |  |   52|  19.1k|			vips__thread_gate_stop(NAME); \
  |  |   53|  19.1k|	} \
  |  |   54|  19.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|       |
  133|       |	/* If we've seen an error, everything must stop.
  134|       |	 */
  135|  19.1k|	if (sequential->error) {
  ------------------
  |  Branch (135:6): [True: 0, False: 19.1k]
  ------------------
  136|      0|		g_mutex_unlock(sequential->lock);
  137|      0|		return -1;
  138|      0|	}
  139|       |
  140|  19.1k|	if (r->top > sequential->y_pos) {
  ------------------
  |  Branch (140:6): [True: 0, False: 19.1k]
  ------------------
  141|       |		/* This is a request for something some way down the image.
  142|       |		 * Probably the operation is something like extract_area and
  143|       |		 * we should skip the initial part of the image. In fact,
  144|       |		 * we read to cache, since it may be useful.
  145|       |		 *
  146|       |		 * Read in chunks, since we may be skipping *many* lines of image from
  147|       |		 * a file source.
  148|       |		 */
  149|      0|		int y;
  150|       |
  151|      0|		for (y = sequential->y_pos; y < r->top; y += sequential->tile_height) {
  ------------------
  |  Branch (151:31): [True: 0, False: 0]
  ------------------
  152|      0|			VipsRect area;
  153|       |
  154|      0|			area.left = 0;
  155|      0|			area.top = y;
  156|      0|			area.width = 1;
  157|      0|			area.height = VIPS_MIN(sequential->tile_height, r->top - area.top);
  ------------------
  |  |   55|      0|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  158|      0|			if (vips_region_prepare(ir, &area)) {
  ------------------
  |  Branch (158:8): [True: 0, False: 0]
  ------------------
  159|      0|				sequential->error = -1;
  160|      0|				g_mutex_unlock(sequential->lock);
  161|      0|				return -1;
  162|      0|			}
  163|       |
  164|      0|			sequential->y_pos += area.height;
  165|      0|		}
  166|      0|	}
  167|       |
  168|       |	/* This is a request for old pixels, or for pixels exactly at the read
  169|       |	 * point. This might trigger a generate from the thing feeding the cache,
  170|       |	 * eg. a loader.
  171|       |	 */
  172|  19.1k|	if (vips_region_prepare(ir, r) ||
  ------------------
  |  Branch (172:6): [True: 5.52k, False: 13.5k]
  ------------------
  173|  19.1k|		vips_region_region(out_region, ir, r, r->left, r->top)) {
  ------------------
  |  Branch (173:3): [True: 0, False: 13.5k]
  ------------------
  174|  5.52k|		sequential->error = -1;
  175|  5.52k|		g_mutex_unlock(sequential->lock);
  176|  5.52k|		return -1;
  177|  5.52k|	}
  178|       |
  179|  13.5k|	sequential->y_pos = VIPS_MAX(sequential->y_pos, VIPS_RECT_BOTTOM(r));
  ------------------
  |  |   54|  13.5k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 13.5k]
  |  |  ------------------
  ------------------
  180|       |
  181|  13.5k|	g_mutex_unlock(sequential->lock);
  182|       |
  183|  13.5k|	return 0;
  184|  19.1k|}
sequential.c:vips_sequential_init:
  272|  8.76k|{
  273|  8.76k|	sequential->lock = vips_g_mutex_new();
  274|  8.76k|	sequential->tile_height = 1;
  275|  8.76k|	sequential->error = 0;
  276|  8.76k|	sequential->trace = FALSE;
  ------------------
  |  |  794|  8.76k|#define	FALSE	(0)
  ------------------
  277|  8.76k|}

smartcrop.c:vips_smartcrop_class_init:
  419|      1|{
  420|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  421|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  422|       |
  423|      1|	VIPS_DEBUG_MSG("vips_smartcrop_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  424|       |
  425|      1|	gobject_class->set_property = vips_object_set_property;
  426|      1|	gobject_class->get_property = vips_object_get_property;
  427|       |
  428|      1|	vobject_class->nickname = "smartcrop";
  429|      1|	vobject_class->description = _("extract an area from an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  430|      1|	vobject_class->build = vips_smartcrop_build;
  431|       |
  432|      1|	VIPS_ARG_IMAGE(class, "input", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  433|      1|		_("Input"),
  434|      1|		_("Input image"),
  435|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  436|      1|		G_STRUCT_OFFSET(VipsSmartcrop, in));
  437|       |
  438|      1|	VIPS_ARG_INT(class, "width", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  439|      1|		_("Width"),
  440|      1|		_("Width of extract area"),
  441|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  442|      1|		G_STRUCT_OFFSET(VipsSmartcrop, width),
  443|      1|		1, VIPS_MAX_COORD, 1);
  444|       |
  445|      1|	VIPS_ARG_INT(class, "height", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  446|      1|		_("Height"),
  447|      1|		_("Height of extract area"),
  448|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  449|      1|		G_STRUCT_OFFSET(VipsSmartcrop, height),
  450|      1|		1, VIPS_MAX_COORD, 1);
  451|       |
  452|      1|	VIPS_ARG_ENUM(class, "interesting", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  453|      1|		_("Interesting"),
  454|      1|		_("How to measure interestingness"),
  455|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  456|      1|		G_STRUCT_OFFSET(VipsSmartcrop, interesting),
  457|      1|		VIPS_TYPE_INTERESTING, VIPS_INTERESTING_ATTENTION);
  458|       |
  459|      1|	VIPS_ARG_INT(class, "attention_x", 2,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  460|      1|		_("Attention x"),
  461|      1|		_("Horizontal position of attention centre"),
  462|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  463|      1|		G_STRUCT_OFFSET(VipsSmartcrop, attention_x),
  464|      1|		0, VIPS_MAX_COORD, 0);
  465|       |
  466|      1|	VIPS_ARG_INT(class, "attention_y", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  467|      1|		_("Attention y"),
  468|      1|		_("Vertical position of attention centre"),
  469|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  470|      1|		G_STRUCT_OFFSET(VipsSmartcrop, attention_y),
  471|      1|		0, VIPS_MAX_COORD, 0);
  472|       |
  473|      1|	VIPS_ARG_BOOL(class, "premultiplied", 7,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  474|      1|		_("Premultiplied"),
  475|      1|		_("Input image already has premultiplied alpha"),
  476|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  477|      1|		G_STRUCT_OFFSET(VipsSmartcrop, premultiplied),
  478|      1|		FALSE);
  479|      1|}

subsample.c:vips_subsample_class_init:
  251|      1|{
  252|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  253|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  254|       |
  255|      1|	gobject_class->set_property = vips_object_set_property;
  256|      1|	gobject_class->get_property = vips_object_get_property;
  257|       |
  258|      1|	vobject_class->nickname = "subsample";
  259|      1|	vobject_class->description = _("subsample an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  260|      1|	vobject_class->build = vips_subsample_build;
  261|       |
  262|       |	/* We don't work well as sequential: we can easily skip the first few
  263|       |	 * scanlines, and that confuses vips_sequential().
  264|       |	 */
  265|       |
  266|      1|	VIPS_ARG_IMAGE(class, "input", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  267|      1|		_("Input"),
  268|      1|		_("Input image"),
  269|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  270|      1|		G_STRUCT_OFFSET(VipsSubsample, in));
  271|       |
  272|      1|	VIPS_ARG_INT(class, "xfac", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  273|      1|		_("Xfac"),
  274|      1|		_("Horizontal subsample factor"),
  275|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  276|      1|		G_STRUCT_OFFSET(VipsSubsample, xfac),
  277|      1|		1, VIPS_MAX_COORD, 1);
  278|       |
  279|      1|	VIPS_ARG_INT(class, "yfac", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  280|      1|		_("Yfac"),
  281|      1|		_("Vertical subsample factor"),
  282|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  283|      1|		G_STRUCT_OFFSET(VipsSubsample, yfac),
  284|      1|		1, VIPS_MAX_COORD, 1);
  285|       |
  286|      1|	VIPS_ARG_BOOL(class, "point", 5,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  287|      1|		_("Point"),
  288|      1|		_("Point sample"),
  289|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  290|      1|		G_STRUCT_OFFSET(VipsSubsample, point),
  291|      1|		FALSE);
  292|      1|}

switch.c:vips_switch_class_init:
  179|      1|{
  180|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  181|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  182|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  183|       |
  184|      1|	gobject_class->set_property = vips_object_set_property;
  185|      1|	gobject_class->get_property = vips_object_get_property;
  186|       |
  187|      1|	object_class->nickname = "switch";
  188|      1|	object_class->description =
  189|      1|		_("find the index of the first non-zero pixel in tests");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  190|      1|	object_class->build = vips_switch_build;
  191|       |
  192|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  193|       |
  194|      1|	VIPS_ARG_BOXED(class, "tests", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  195|      1|		_("Tests"),
  196|      1|		_("Table of images to test"),
  197|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  198|      1|		G_STRUCT_OFFSET(VipsSwitch, tests),
  199|      1|		VIPS_TYPE_ARRAY_IMAGE);
  200|       |
  201|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  202|      1|		_("Output"),
  203|      1|		_("Output image"),
  204|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  205|      1|		G_STRUCT_OFFSET(VipsSwitch, out));
  206|      1|}

vips_tilecache:
  864|    818|{
  865|    818|	va_list ap;
  866|    818|	int result;
  867|       |
  868|    818|	va_start(ap, out);
  869|    818|	result = vips_call_split("tilecache", ap, in, out);
  870|    818|	va_end(ap);
  871|       |
  872|    818|	return result;
  873|    818|}
vips_linecache:
 1031|  8.76k|{
 1032|  8.76k|	va_list ap;
 1033|  8.76k|	int result;
 1034|       |
 1035|  8.76k|	va_start(ap, out);
 1036|  8.76k|	result = vips_call_split("linecache", ap, in, out);
 1037|  8.76k|	va_end(ap);
 1038|       |
 1039|  8.76k|	return result;
 1040|  8.76k|}
tilecache.c:vips_block_cache_class_init:
  380|      1|{
  381|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  382|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  383|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  384|       |
  385|      1|	VIPS_DEBUG_MSG("vips_block_cache_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  386|       |
  387|      1|	gobject_class->dispose = vips_block_cache_dispose;
  388|      1|	gobject_class->set_property = vips_object_set_property;
  389|      1|	gobject_class->get_property = vips_object_get_property;
  390|       |
  391|      1|	vobject_class->nickname = "blockcache";
  392|      1|	vobject_class->description = _("cache an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  393|      1|	vobject_class->build = vips_block_cache_build;
  394|       |
  395|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  396|       |
  397|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  398|      1|		_("Input"),
  399|      1|		_("Input image"),
  400|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  401|      1|		G_STRUCT_OFFSET(VipsBlockCache, in));
  402|       |
  403|      1|	VIPS_ARG_INT(class, "tile_height", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  404|      1|		_("Tile height"),
  405|      1|		_("Tile height in pixels"),
  406|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  407|      1|		G_STRUCT_OFFSET(VipsBlockCache, tile_height),
  408|      1|		1, 1000000, 128);
  409|       |
  410|      1|	VIPS_ARG_ENUM(class, "access", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  411|      1|		_("Access"),
  412|      1|		_("Expected access pattern"),
  413|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  414|      1|		G_STRUCT_OFFSET(VipsBlockCache, access),
  415|      1|		VIPS_TYPE_ACCESS, VIPS_ACCESS_RANDOM);
  416|       |
  417|      1|	VIPS_ARG_BOOL(class, "threaded", 7,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  418|      1|		_("Threaded"),
  419|      1|		_("Allow threaded access"),
  420|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  421|      1|		G_STRUCT_OFFSET(VipsBlockCache, threaded),
  422|      1|		FALSE);
  423|       |
  424|      1|	VIPS_ARG_BOOL(class, "persistent", 8,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  425|      1|		_("Persistent"),
  426|      1|		_("Keep cache between evaluations"),
  427|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  428|      1|		G_STRUCT_OFFSET(VipsBlockCache, persistent),
  429|      1|		FALSE);
  430|      1|}
tilecache.c:vips_block_cache_dispose:
  157|  9.57k|{
  158|  9.57k|	VipsBlockCache *cache = (VipsBlockCache *) gobject;
  159|       |
  160|  9.57k|	vips_block_cache_drop_all(cache);
  161|  9.57k|	VIPS_FREEF(vips_g_mutex_free, cache->lock);
  ------------------
  |  |   41|  9.57k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.57k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  9.57k|	{ \
  |  |   43|  9.57k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 9.57k, False: 0]
  |  |  ------------------
  |  |   44|  9.57k|			(void) F((S)); \
  |  |   45|  9.57k|			(S) = 0; \
  |  |   46|  9.57k|		} \
  |  |   47|  9.57k|	} \
  |  |   48|  9.57k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.57k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  162|  9.57k|	VIPS_FREEF(vips_g_cond_free, cache->new_tile);
  ------------------
  |  |   41|  9.57k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.57k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  9.57k|	{ \
  |  |   43|  9.57k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 9.57k, False: 0]
  |  |  ------------------
  |  |   44|  9.57k|			(void) F((S)); \
  |  |   45|  9.57k|			(S) = 0; \
  |  |   46|  9.57k|		} \
  |  |   47|  9.57k|	} \
  |  |   48|  9.57k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.57k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  163|       |
  164|  9.57k|	if (cache->tiles)
  ------------------
  |  Branch (164:6): [True: 9.57k, False: 0]
  ------------------
  165|  9.57k|		g_assert(g_hash_table_size(cache->tiles) == 0);
  ------------------
  |  |  166|  9.57k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  9.57k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.57k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  166|  9.57k|	VIPS_FREEF(g_hash_table_destroy, cache->tiles);
  ------------------
  |  |   41|  9.57k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.57k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  9.57k|	{ \
  |  |   43|  9.57k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 9.57k, False: 0]
  |  |  ------------------
  |  |   44|  9.57k|			(void) F((S)); \
  |  |   45|  9.57k|			(S) = 0; \
  |  |   46|  9.57k|		} \
  |  |   47|  9.57k|	} \
  |  |   48|  9.57k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.57k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  167|  9.57k|	VIPS_FREEF(g_queue_free, cache->recycle);
  ------------------
  |  |   41|  9.57k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.57k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  9.57k|	{ \
  |  |   43|  9.57k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 9.57k, False: 0]
  |  |  ------------------
  |  |   44|  9.57k|			(void) F((S)); \
  |  |   45|  9.57k|			(S) = 0; \
  |  |   46|  9.57k|		} \
  |  |   47|  9.57k|	} \
  |  |   48|  9.57k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.57k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|       |
  169|  9.57k|	G_OBJECT_CLASS(vips_block_cache_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  9.57k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  9.57k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  9.57k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  170|  9.57k|}
tilecache.c:vips_block_cache_drop_all:
  147|  9.57k|{
  148|       |	/* FIXME this is a disaster if active threads are working on tiles. We
  149|       |	 * should have something to block new requests, and only dispose once
  150|       |	 * all tiles are unreffed.
  151|       |	 */
  152|  9.57k|	g_hash_table_remove_all(cache->tiles);
  153|  9.57k|}
tilecache.c:vips_block_cache_build:
  357|  9.58k|{
  358|  9.58k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  9.58k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  9.58k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  9.58k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  9.58k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  359|  9.58k|	VipsBlockCache *cache = (VipsBlockCache *) object;
  360|       |
  361|  9.58k|	VIPS_DEBUG_MSG("vips_block_cache_build:\n");
  ------------------
  |  |   47|  9.58k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.58k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  9.58k|	{ \
  |  |   49|  9.58k|		; \
  |  |   50|  9.58k|	} \
  |  |   51|  9.58k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.58k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  362|       |
  363|  9.58k|	if (VIPS_OBJECT_CLASS(vips_block_cache_parent_class)->build(object))
  ------------------
  |  |  435|  9.58k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  9.58k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  9.58k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (363:6): [True: 0, False: 9.58k]
  ------------------
  364|      0|		return -1;
  365|       |
  366|  9.58k|	VIPS_DEBUG_MSG("vips_block_cache_build: max size = %g MB\n",
  ------------------
  |  |   47|  9.58k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.58k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  9.58k|	{ \
  |  |   49|  9.58k|		; \
  |  |   50|  9.58k|	} \
  |  |   51|  9.58k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.58k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  367|  9.58k|		(cache->max_tiles * cache->tile_width * cache->tile_height *
  368|  9.58k|			VIPS_IMAGE_SIZEOF_PEL(cache->in)) /
  369|  9.58k|			(1024 * 1024.0));
  370|       |
  371|  9.58k|	if (!cache->persistent)
  ------------------
  |  Branch (371:6): [True: 9.58k, False: 0]
  ------------------
  372|  9.58k|		g_signal_connect(conversion->out, "minimise",
  ------------------
  |  |  491|  9.58k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  373|  9.58k|			G_CALLBACK(vips_block_cache_minimise), cache);
  374|       |
  375|  9.58k|	return 0;
  376|  9.58k|}
tilecache.c:vips_block_cache_minimise:
  342|  19.1k|{
  343|  19.1k|	VIPS_DEBUG_MSG("vips_block_cache_minimise:\n");
  ------------------
  |  |   47|  19.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  19.1k|	{ \
  |  |   49|  19.1k|		; \
  |  |   50|  19.1k|	} \
  |  |   51|  19.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  344|       |
  345|  19.1k|	g_mutex_lock(cache->lock);
  346|       |
  347|       |	/* We can't drop tiles that are in use.
  348|       |	 */
  349|  19.1k|	g_hash_table_foreach_remove(cache->tiles,
  350|  19.1k|		vips_tile_unlocked, NULL);
  351|       |
  352|  19.1k|	g_mutex_unlock(cache->lock);
  353|  19.1k|}
tilecache.c:vips_tile_unlocked:
  334|   107k|{
  335|   107k|	VipsTile *tile = (VipsTile *) value;
  336|       |
  337|   107k|	return !tile->ref_count;
  338|   107k|}
tilecache.c:vips_block_cache_init:
  476|  9.58k|{
  477|  9.58k|	cache->tile_width = 128;
  478|  9.58k|	cache->tile_height = 128;
  479|  9.58k|	cache->max_tiles = 1000;
  480|  9.58k|	cache->access = VIPS_ACCESS_RANDOM;
  481|  9.58k|	cache->threaded = FALSE;
  ------------------
  |  |  794|  9.58k|#define	FALSE	(0)
  ------------------
  482|  9.58k|	cache->persistent = FALSE;
  ------------------
  |  |  794|  9.58k|#define	FALSE	(0)
  ------------------
  483|       |
  484|  9.58k|	cache->lock = vips_g_mutex_new();
  485|  9.58k|	cache->new_tile = vips_g_cond_new();
  486|  9.58k|	cache->tiles = g_hash_table_new_full(
  487|  9.58k|		(GHashFunc) vips_rect_hash,
  488|  9.58k|		(GEqualFunc) vips_rect_equal,
  489|  9.58k|		NULL,
  490|  9.58k|		(GDestroyNotify) vips_tile_destroy);
  491|  9.58k|	cache->recycle = g_queue_new();
  492|  9.58k|}
tilecache.c:vips_rect_hash:
  434|   217k|{
  435|   217k|	guint hash;
  436|       |
  437|       |	/* We could shift down by the tile size?
  438|       |	 *
  439|       |	 * X discrimination is more important than Y, since
  440|       |	 * most tiles will have a similar Y.
  441|       |	 */
  442|   217k|	hash = (guint) pos->left ^ ((guint) pos->top << 16);
  443|       |
  444|   217k|	return hash;
  445|   217k|}
tilecache.c:vips_rect_equal:
  449|  3.14k|{
  450|  3.14k|	return a->left == b->left && a->top == b->top;
  ------------------
  |  Branch (450:9): [True: 3.14k, False: 0]
  |  Branch (450:31): [True: 3.14k, False: 0]
  ------------------
  451|  3.14k|}
tilecache.c:vips_tile_destroy:
  455|   107k|{
  456|   107k|	VipsBlockCache *cache = tile->cache;
  457|       |
  458|   107k|	VIPS_DEBUG_MSG_RED("vips_tile_destroy: tile %d, %d (%p)\n",
  ------------------
  |  |   63|   107k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   107k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|   107k|	{ \
  |  |   65|   107k|		; \
  |  |   66|   107k|	} \
  |  |   67|   107k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   107k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  459|   107k|		tile->pos.left, tile->pos.top, tile);
  460|       |
  461|       |	/* 0 ref tiles should be on the recycle list.
  462|       |	 */
  463|   107k|	g_assert(tile->ref_count == 0);
  ------------------
  |  |  166|   107k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   107k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   107k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  464|   107k|	g_assert(g_queue_find(tile->cache->recycle, tile));
  ------------------
  |  |  166|   107k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   107k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   107k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  465|   107k|	g_queue_remove(cache->recycle, tile);
  466|       |
  467|   107k|	tile->cache = NULL;
  468|       |
  469|   107k|	VIPS_UNREF(tile->region);
  ------------------
  |  |   57|   107k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|   107k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   107k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   107k|	{ \
  |  |  |  |   43|   107k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 107k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   107k|			(void) F((S)); \
  |  |  |  |   45|   107k|			(S) = 0; \
  |  |  |  |   46|   107k|		} \
  |  |  |  |   47|   107k|	} \
  |  |  |  |   48|   107k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   107k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  470|       |
  471|   107k|	g_free(tile);
  472|   107k|}
tilecache.c:vips_tile_cache_class_init:
  786|      1|{
  787|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  788|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  789|       |
  790|      1|	VIPS_DEBUG_MSG("vips_tile_cache_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  791|       |
  792|      1|	gobject_class->set_property = vips_object_set_property;
  793|      1|	gobject_class->get_property = vips_object_get_property;
  794|       |
  795|      1|	vobject_class->nickname = "tilecache";
  796|      1|	vobject_class->description = _("cache an image as a set of tiles");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  797|      1|	vobject_class->build = vips_tile_cache_build;
  798|       |
  799|      1|	VIPS_ARG_INT(class, "tile_width", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  800|      1|		_("Tile width"),
  801|      1|		_("Tile width in pixels"),
  802|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  803|      1|		G_STRUCT_OFFSET(VipsBlockCache, tile_width),
  804|      1|		1, 1000000, 128);
  805|       |
  806|      1|	VIPS_ARG_INT(class, "max_tiles", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  807|      1|		_("Max tiles"),
  808|      1|		_("Maximum number of tiles to cache"),
  809|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  810|      1|		G_STRUCT_OFFSET(VipsBlockCache, max_tiles),
  811|      1|		-1, 1000000, 1000);
  812|      1|}
tilecache.c:vips_tile_cache_build:
  759|    818|{
  760|    818|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|    818|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    818|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    818|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|    818|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  761|    818|	VipsBlockCache *block_cache = (VipsBlockCache *) object;
  762|    818|	VipsTileCache *cache = (VipsTileCache *) object;
  763|       |
  764|    818|	VIPS_DEBUG_MSG("vips_tile_cache_build\n");
  ------------------
  |  |   47|    818|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    818|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    818|	{ \
  |  |   49|    818|		; \
  |  |   50|    818|	} \
  |  |   51|    818|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    818|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  765|       |
  766|    818|	if (VIPS_OBJECT_CLASS(vips_tile_cache_parent_class)->build(object))
  ------------------
  |  |  435|    818|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    818|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    818|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (766:6): [True: 0, False: 818]
  ------------------
  767|      0|		return -1;
  768|       |
  769|    818|	if (vips_image_pio_input(block_cache->in))
  ------------------
  |  Branch (769:6): [True: 0, False: 818]
  ------------------
  770|      0|		return -1;
  771|       |
  772|    818|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (772:6): [True: 0, False: 818]
  ------------------
  773|    818|			VIPS_DEMAND_STYLE_SMALLTILE, block_cache->in, NULL))
  774|      0|		return -1;
  775|       |
  776|    818|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (776:6): [True: 0, False: 818]
  ------------------
  777|    818|			vips_start_one, vips_tile_cache_gen, vips_stop_one,
  778|    818|			block_cache->in, cache))
  779|      0|		return -1;
  780|       |
  781|    818|	return 0;
  782|    818|}
tilecache.c:vips_tile_cache_gen:
  604|  19.9k|{
  605|  19.9k|	VipsRegion *in = (VipsRegion *) seq;
  606|  19.9k|	VipsBlockCache *cache = (VipsBlockCache *) b;
  607|  19.9k|	VipsRect *r = &out_region->valid;
  608|       |
  609|  19.9k|	VipsTile *tile;
  610|  19.9k|	GSList *work;
  611|  19.9k|	GSList *p;
  612|  19.9k|	int result;
  613|       |
  614|  19.9k|	result = 0;
  615|       |
  616|  19.9k|	VIPS_GATE_START("vips_tile_cache_gen: wait1");
  ------------------
  |  |   41|  19.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  19.9k|	{ \
  |  |   43|  19.9k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 19.9k]
  |  |  ------------------
  |  |   44|  19.9k|			vips__thread_gate_start(NAME); \
  |  |   45|  19.9k|	} \
  |  |   46|  19.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  617|       |
  618|  19.9k|	vips__worker_lock(cache->lock);
  619|       |
  620|  19.9k|	VIPS_GATE_STOP("vips_tile_cache_gen: wait1");
  ------------------
  |  |   49|  19.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  19.9k|	{ \
  |  |   51|  19.9k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 19.9k]
  |  |  ------------------
  |  |   52|  19.9k|			vips__thread_gate_stop(NAME); \
  |  |   53|  19.9k|	} \
  |  |   54|  19.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  621|       |
  622|  19.9k|	VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|  19.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|  19.9k|	{ \
  |  |   65|  19.9k|		; \
  |  |   66|  19.9k|	} \
  |  |   67|  19.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  623|  19.9k|		"vips_tile_cache_gen: "
  624|  19.9k|		"left = %d, top = %d, width = %d, height = %d\n",
  625|  19.9k|		r->left, r->top, r->width, r->height);
  626|       |
  627|       |	/* Ref all the tiles we will need.
  628|       |	 */
  629|  19.9k|	work = vips_tile_cache_ref(cache, r);
  630|       |
  631|   146k|	while (work) {
  ------------------
  |  Branch (631:9): [True: 126k, False: 19.9k]
  ------------------
  632|       |		/* Search for data tiles: easy, we can just paste those in.
  633|       |		 */
  634|   237k|		for (;;) {
  635|  1.24M|			for (p = work; p; p = p->next) {
  ------------------
  |  Branch (635:19): [True: 1.11M, False: 126k]
  ------------------
  636|  1.11M|				tile = (VipsTile *) p->data;
  637|       |
  638|  1.11M|				if (tile->state == VIPS_TILE_STATE_DATA)
  ------------------
  |  Branch (638:9): [True: 110k, False: 1.00M]
  ------------------
  639|   110k|					break;
  640|  1.11M|			}
  641|       |
  642|   237k|			if (!p)
  ------------------
  |  Branch (642:8): [True: 126k, False: 110k]
  ------------------
  643|   126k|				break;
  644|       |
  645|   237k|			VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|   110k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   110k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|   110k|	{ \
  |  |   65|   110k|		; \
  |  |   66|   110k|	} \
  |  |   67|   237k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   237k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  646|   110k|				"vips_tile_cache_gen: pasting %p\n",
  647|   110k|				tile);
  648|       |
  649|   110k|			vips_tile_paste(tile, out_region);
  650|       |
  651|       |			/* We're done with this tile.
  652|       |			 */
  653|   110k|			work = g_slist_remove(work, tile);
  654|   110k|			vips_tile_unref(tile);
  655|   110k|		}
  656|       |
  657|       |		/* Calculate the first PEND tile we find on the work list. We
  658|       |		 * don't calculate all PEND tiles since after the first, more
  659|       |		 * DATA tiles might heve been made available by other threads
  660|       |		 * and we want to get them out of the way as soon as we can.
  661|       |		 */
  662|   126k|		for (p = work; p; p = p->next) {
  ------------------
  |  Branch (662:18): [True: 107k, False: 19.9k]
  ------------------
  663|   107k|			tile = (VipsTile *) p->data;
  664|       |
  665|   107k|			if (tile->state == VIPS_TILE_STATE_PEND) {
  ------------------
  |  Branch (665:8): [True: 107k, False: 0]
  ------------------
  666|   107k|				tile->state = VIPS_TILE_STATE_CALC;
  667|       |
  668|   107k|				VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|   107k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   107k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|   107k|	{ \
  |  |   65|   107k|		; \
  |  |   66|   107k|	} \
  |  |   67|   107k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   107k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  669|   107k|					"vips_tile_cache_gen: calc of %p\n",
  670|   107k|					tile);
  671|       |
  672|       |				/* In threaded mode, we let other threads run
  673|       |				 * while we calc this tile. In non-threaded
  674|       |				 * mode, we keep the lock and make 'em wait.
  675|       |				 */
  676|   107k|				if (cache->threaded)
  ------------------
  |  Branch (676:9): [True: 20.6k, False: 86.3k]
  ------------------
  677|  20.6k|					g_mutex_unlock(cache->lock);
  678|       |
  679|       |				/* Don't compute if we've seen an error
  680|       |				 * previously.
  681|       |				 */
  682|   107k|				if (!result)
  ------------------
  |  Branch (682:9): [True: 61.0k, False: 45.9k]
  ------------------
  683|  61.0k|					result = vips_region_prepare_to(in,
  684|  61.0k|						tile->region,
  685|  61.0k|						&tile->pos,
  686|  61.0k|						tile->pos.left, tile->pos.top);
  687|       |
  688|   107k|				if (cache->threaded) {
  ------------------
  |  Branch (688:9): [True: 20.6k, False: 86.3k]
  ------------------
  689|  20.6k|					VIPS_GATE_START("vips_tile_cache_gen: wait2");
  ------------------
  |  |   41|  20.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  20.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  20.6k|	{ \
  |  |   43|  20.6k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 20.6k]
  |  |  ------------------
  |  |   44|  20.6k|			vips__thread_gate_start(NAME); \
  |  |   45|  20.6k|	} \
  |  |   46|  20.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  20.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  690|       |
  691|  20.6k|					g_mutex_lock(cache->lock);
  692|       |
  693|  20.6k|					VIPS_GATE_STOP("vips_tile_cache_gen: wait2");
  ------------------
  |  |   49|  20.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  20.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  20.6k|	{ \
  |  |   51|  20.6k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 20.6k]
  |  |  ------------------
  |  |   52|  20.6k|			vips__thread_gate_stop(NAME); \
  |  |   53|  20.6k|	} \
  |  |   54|  20.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  20.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  694|  20.6k|				}
  695|       |
  696|       |				/* If there was an error calculating this
  697|       |				 * tile, black it out and terminate
  698|       |				 * calculation. We have to stop so we can
  699|       |				 * support things like --fail on jpegload.
  700|       |				 *
  701|       |				 * Don't return early, we'd deadlock.
  702|       |				 */
  703|   107k|				if (result) {
  ------------------
  |  Branch (703:9): [True: 51.5k, False: 55.5k]
  ------------------
  704|  51.5k|					VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|  51.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  51.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|  51.5k|	{ \
  |  |   65|  51.5k|		; \
  |  |   66|  51.5k|	} \
  |  |   67|  51.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  51.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  705|  51.5k|						"vips_tile_cache_gen: error on tile %p\n",
  706|  51.5k|						tile);
  707|       |
  708|  51.5k|					g_warning(_("error in tile %d x %d"),
  ------------------
  |  |  338|  51.5k|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  51.5k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|  51.5k|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|  51.5k|                               __VA_ARGS__)
  ------------------
  709|  51.5k|						tile->pos.left, tile->pos.top);
  710|       |
  711|  51.5k|					vips_region_black(tile->region);
  712|       |
  713|  51.5k|					*stop = TRUE;
  ------------------
  |  |  798|  51.5k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  51.5k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  714|  51.5k|				}
  715|       |
  716|   107k|				tile->state = VIPS_TILE_STATE_DATA;
  717|       |
  718|       |				/* Let everyone know there's a new DATA tile.
  719|       |				 * They need to all check their work lists.
  720|       |				 */
  721|   107k|				g_cond_broadcast(cache->new_tile);
  722|       |
  723|   107k|				break;
  724|   107k|			}
  725|   107k|		}
  726|       |
  727|       |		/* There are no PEND or DATA tiles, we must need a tile some
  728|       |		 * other thread is currently calculating.
  729|       |		 *
  730|       |		 * We must block until the CALC tiles we need are done.
  731|       |		 */
  732|   126k|		if (!p &&
  ------------------
  |  Branch (732:7): [True: 19.9k, False: 107k]
  ------------------
  733|   126k|			work) {
  ------------------
  |  Branch (733:4): [True: 0, False: 19.9k]
  ------------------
  734|      0|			for (p = work; p; p = p->next) {
  ------------------
  |  Branch (734:19): [True: 0, False: 0]
  ------------------
  735|      0|				tile = (VipsTile *) p->data;
  736|       |
  737|      0|				g_assert(tile->state == VIPS_TILE_STATE_CALC);
  ------------------
  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  738|      0|			}
  739|       |
  740|      0|			VIPS_DEBUG_MSG_RED("vips_tile_cache_gen: waiting\n");
  ------------------
  |  |   63|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|      0|	{ \
  |  |   65|      0|		; \
  |  |   66|      0|	} \
  |  |   67|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  741|       |
  742|      0|			VIPS_GATE_START("vips_tile_cache_gen: wait3");
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			vips__thread_gate_start(NAME); \
  |  |   45|      0|	} \
  |  |   46|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  743|       |
  744|      0|			vips__worker_cond_wait(cache->new_tile, cache->lock);
  745|       |
  746|      0|			VIPS_GATE_STOP("vips_tile_cache_gen: wait3");
  ------------------
  |  |   49|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|      0|	{ \
  |  |   51|      0|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   52|      0|			vips__thread_gate_stop(NAME); \
  |  |   53|      0|	} \
  |  |   54|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  747|       |
  748|      0|			VIPS_DEBUG_MSG("vips_tile_cache_gen: awake!\n");
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  749|      0|		}
  750|   126k|	}
  751|       |
  752|  19.9k|	g_mutex_unlock(cache->lock);
  753|       |
  754|  19.9k|	return result;
  755|  19.9k|}
tilecache.c:vips_tile_cache_ref:
  549|  19.9k|{
  550|  19.9k|	const int tw = cache->tile_width;
  551|  19.9k|	const int th = cache->tile_height;
  552|       |
  553|       |	/* Find top left of tiles we need.
  554|       |	 */
  555|  19.9k|	const int xs = (r->left / tw) * tw;
  556|  19.9k|	const int ys = (r->top / th) * th;
  557|       |
  558|  19.9k|	GSList *work;
  559|  19.9k|	VipsTile *tile;
  560|  19.9k|	int x, y;
  561|       |
  562|       |	/* Ref all the tiles we will need.
  563|       |	 */
  564|  19.9k|	work = NULL;
  565|   113k|	for (y = ys; y < VIPS_RECT_BOTTOM(r); y += th)
  ------------------
  |  |   49|   113k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  |  Branch (565:15): [True: 93.5k, False: 19.9k]
  ------------------
  566|   203k|		for (x = xs; x < VIPS_RECT_RIGHT(r); x += tw) {
  ------------------
  |  |   48|   203k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  |  Branch (566:16): [True: 110k, False: 93.5k]
  ------------------
  567|   110k|			if (!(tile = vips_tile_find(cache, x, y))) {
  ------------------
  |  Branch (567:8): [True: 0, False: 110k]
  ------------------
  568|      0|				vips_tile_cache_unref(work);
  569|      0|				return NULL;
  570|      0|			}
  571|       |
  572|   110k|			vips_tile_ref(tile);
  573|       |
  574|       |			/* We must append, since we want to keep tile ordering
  575|       |			 * for sequential sources.
  576|       |			 */
  577|   110k|			work = g_slist_append(work, tile);
  578|       |
  579|   110k|			VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|   110k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   110k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|   110k|	{ \
  |  |   65|   110k|		; \
  |  |   66|   110k|	} \
  |  |   67|   110k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   110k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  580|   110k|				"vips_tile_cache_ref: tile %d, %d (%p)\n",
  581|   110k|				x, y, tile);
  582|   110k|		}
  583|       |
  584|  19.9k|	return work;
  585|  19.9k|}
tilecache.c:vips_tile_find:
  277|   110k|{
  278|   110k|	VipsTile *tile;
  279|       |
  280|       |	/* In cache already?
  281|       |	 */
  282|   110k|	if ((tile = vips_tile_search(cache, x, y))) {
  ------------------
  |  Branch (282:6): [True: 3.14k, False: 107k]
  ------------------
  283|  3.14k|		VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|  3.14k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  3.14k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|  3.14k|	{ \
  |  |   65|  3.14k|		; \
  |  |   66|  3.14k|	} \
  |  |   67|  3.14k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.14k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  284|  3.14k|			"vips_tile_find: tile %d x %d in cache\n", x, y);
  285|  3.14k|		return tile;
  286|  3.14k|	}
  287|       |
  288|       |	/* VipsBlockCache not full?
  289|       |	 */
  290|   107k|	if (cache->max_tiles == -1 ||
  ------------------
  |  Branch (290:6): [True: 0, False: 107k]
  ------------------
  291|   107k|		g_hash_table_size(cache->tiles) < cache->max_tiles) {
  ------------------
  |  Branch (291:3): [True: 93.5k, False: 13.4k]
  ------------------
  292|  93.5k|		VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|  93.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  93.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|  93.5k|	{ \
  |  |   65|  93.5k|		; \
  |  |   66|  93.5k|	} \
  |  |   67|  93.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  93.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  293|  93.5k|			"vips_tile_find: making new tile at %d x %d\n", x, y);
  294|  93.5k|		if (!(tile = vips_tile_new(cache, x, y)))
  ------------------
  |  Branch (294:7): [True: 0, False: 93.5k]
  ------------------
  295|      0|			return NULL;
  296|       |
  297|  93.5k|		return tile;
  298|  93.5k|	}
  299|       |
  300|       |	/* Reuse an old one, if there are any. We just peek the tile pointer,
  301|       |	 * it is removed from the recycle list later on _ref.
  302|       |	 */
  303|  13.4k|	if (cache->recycle) {
  ------------------
  |  Branch (303:6): [True: 13.4k, False: 0]
  ------------------
  304|  13.4k|		if (cache->access == VIPS_ACCESS_RANDOM)
  ------------------
  |  Branch (304:7): [True: 13.4k, False: 0]
  ------------------
  305|  13.4k|			tile = g_queue_peek_head(cache->recycle);
  306|      0|		else
  307|       |			/* This is slower :( We have to search the recycle
  308|       |			 * queue.
  309|       |			 */
  310|      0|			tile = vips_tile_find_topmost(cache->recycle);
  311|  13.4k|	}
  312|       |
  313|  13.4k|	if (!tile) {
  ------------------
  |  Branch (313:6): [True: 13.4k, False: 0]
  ------------------
  314|       |		/* There are no tiles we can reuse -- we have to make another
  315|       |		 * for now. They will get culled down again next time around.
  316|       |		 */
  317|  13.4k|		if (!(tile = vips_tile_new(cache, x, y)))
  ------------------
  |  Branch (317:7): [True: 0, False: 13.4k]
  ------------------
  318|      0|			return NULL;
  319|       |
  320|  13.4k|		return tile;
  321|  13.4k|	}
  322|       |
  323|  13.4k|	VIPS_DEBUG_MSG_RED("vips_tile_find: reusing tile %d x %d\n",
  ------------------
  |  |   63|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|      0|	{ \
  |  |   65|      0|		; \
  |  |   66|      0|	} \
  |  |   67|  13.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  13.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  324|      0|		tile->pos.left, tile->pos.top);
  325|       |
  326|      0|	if (vips_tile_move(tile, x, y))
  ------------------
  |  Branch (326:6): [True: 0, False: 0]
  ------------------
  327|      0|		return NULL;
  328|       |
  329|      0|	return tile;
  330|      0|}
tilecache.c:vips_tile_search:
  235|   110k|{
  236|   110k|	VipsRect pos;
  237|   110k|	VipsTile *tile;
  238|       |
  239|   110k|	pos.left = x;
  240|   110k|	pos.top = y;
  241|   110k|	pos.width = cache->tile_width;
  242|   110k|	pos.height = cache->tile_height;
  243|   110k|	tile = (VipsTile *) g_hash_table_lookup(cache->tiles, &pos);
  244|       |
  245|   110k|	return tile;
  246|   110k|}
tilecache.c:vips_tile_new:
  199|   107k|{
  200|   107k|	VipsTile *tile;
  201|       |
  202|   107k|	if (!(tile = VIPS_NEW(NULL, VipsTile)))
  ------------------
  |  |   70|   107k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   107k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   107k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   107k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   107k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (202:6): [True: 0, False: 107k]
  ------------------
  203|      0|		return NULL;
  204|       |
  205|   107k|	tile->cache = cache;
  206|   107k|	tile->state = VIPS_TILE_STATE_PEND;
  207|   107k|	tile->ref_count = 0;
  208|   107k|	tile->region = NULL;
  209|   107k|	tile->pos.left = x;
  210|   107k|	tile->pos.top = y;
  211|   107k|	tile->pos.width = cache->tile_width;
  212|   107k|	tile->pos.height = cache->tile_height;
  213|   107k|	g_hash_table_insert(cache->tiles, &tile->pos, tile);
  214|   107k|	g_queue_push_tail(tile->cache->recycle, tile);
  215|       |
  216|   107k|	if (!(tile->region = vips_region_new(cache->in))) {
  ------------------
  |  Branch (216:6): [True: 0, False: 107k]
  ------------------
  217|      0|		g_hash_table_remove(cache->tiles, &tile->pos);
  218|      0|		return NULL;
  219|      0|	}
  220|       |
  221|   107k|	vips__region_no_ownership(tile->region);
  222|       |
  223|   107k|	if (vips_region_buffer(tile->region, &tile->pos)) {
  ------------------
  |  Branch (223:6): [True: 0, False: 107k]
  ------------------
  224|      0|		g_hash_table_remove(cache->tiles, &tile->pos);
  225|      0|		return NULL;
  226|      0|	}
  227|       |
  228|   107k|	return tile;
  229|   107k|}
tilecache.c:vips_tile_ref:
  522|   110k|{
  523|   110k|	tile->ref_count += 1;
  524|       |
  525|   110k|	g_assert(tile->ref_count > 0);
  ------------------
  |  |  166|   110k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   110k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   110k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  526|       |
  527|   110k|	if (tile->ref_count == 1) {
  ------------------
  |  Branch (527:6): [True: 110k, False: 0]
  ------------------
  528|   110k|		g_assert(g_queue_find(tile->cache->recycle, tile));
  ------------------
  |  |  166|   110k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   110k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   110k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  529|       |
  530|   110k|		g_queue_remove(tile->cache->recycle, tile);
  531|   110k|	}
  532|   110k|}
tilecache.c:vips_tile_paste:
  589|   110k|{
  590|   110k|	VipsRect hit;
  591|       |
  592|       |	/* The part of the tile that we need.
  593|       |	 */
  594|   110k|	vips_rect_intersectrect(&out_region->valid, &tile->pos, &hit);
  595|   110k|	if (!vips_rect_isempty(&hit))
  ------------------
  |  Branch (595:6): [True: 110k, False: 0]
  ------------------
  596|   110k|		vips_region_copy(tile->region, out_region, &hit, hit.left, hit.top);
  597|   110k|}
tilecache.c:vips_tile_unref:
  505|   110k|{
  506|   110k|	g_assert(tile->ref_count > 0);
  ------------------
  |  |  166|   110k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   110k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   110k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  507|       |
  508|   110k|	tile->ref_count -= 1;
  509|       |
  510|   110k|	if (tile->ref_count == 0) {
  ------------------
  |  Branch (510:6): [True: 110k, False: 0]
  ------------------
  511|       |		/* Place at the end of the recycle queue. We pop from the
  512|       |		 * front when selecting an unused tile for reuse.
  513|       |		 */
  514|   110k|		g_assert(!g_queue_find(tile->cache->recycle, tile));
  ------------------
  |  |  166|   110k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   110k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   110k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  515|       |
  516|   110k|		g_queue_push_tail(tile->cache->recycle, tile);
  517|   110k|	}
  518|   110k|}
tilecache.c:vips_tile_cache_init:
  816|    818|{
  817|    818|}
tilecache.c:vips_line_cache_class_init:
  977|      1|{
  978|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  979|       |
  980|      1|	VIPS_DEBUG_MSG("vips_line_cache_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  981|       |
  982|      1|	vobject_class->nickname = "linecache";
  983|      1|	vobject_class->description = _("cache an image as a set of lines");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  984|      1|	vobject_class->build = vips_line_cache_build;
  985|      1|}
tilecache.c:vips_line_cache_build:
  913|  8.76k|{
  914|  8.76k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  8.76k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  8.76k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  8.76k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  8.76k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  915|  8.76k|	VipsBlockCache *block_cache = (VipsBlockCache *) object;
  916|  8.76k|	VipsLineCache *cache = (VipsLineCache *) object;
  917|       |
  918|  8.76k|	int tile_width;
  919|  8.76k|	int tile_height;
  920|  8.76k|	int n_lines;
  921|       |
  922|  8.76k|	VIPS_DEBUG_MSG("vips_line_cache_build\n");
  ------------------
  |  |   47|  8.76k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.76k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  8.76k|	{ \
  |  |   49|  8.76k|		; \
  |  |   50|  8.76k|	} \
  |  |   51|  8.76k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.76k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  923|       |
  924|  8.76k|	if (!vips_object_argument_isset(object, "access"))
  ------------------
  |  Branch (924:6): [True: 0, False: 8.76k]
  ------------------
  925|      0|		block_cache->access = VIPS_ACCESS_SEQUENTIAL; // FIXME: Invalidates operation cache
  926|       |
  927|  8.76k|	if (VIPS_OBJECT_CLASS(vips_line_cache_parent_class)->build(object))
  ------------------
  |  |  435|  8.76k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  8.76k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  8.76k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (927:6): [True: 0, False: 8.76k]
  ------------------
  928|      0|		return -1;
  929|       |
  930|       |	/* This can go up with request size, see vips_line_cache_gen().
  931|       |	 */
  932|  8.76k|	vips_get_tile_size(block_cache->in,
  933|  8.76k|		&tile_width, &tile_height, &n_lines);
  934|  8.76k|	block_cache->tile_width = block_cache->in->Xsize; // FIXME: Invalidates operation cache
  935|       |
  936|       |	/* Output has two buffers n_lines height, so 2 * n_lines is the maximum
  937|       |	 * non-locality from threading. Double again for conv, rounding, etc.
  938|       |	 *
  939|       |	 * tile_height can be huge for things like tiff read, where we can
  940|       |	 * have a whole strip in a single tile ... we still need to have a
  941|       |	 * minimum of two strips, so we can handle requests that straddle a
  942|       |	 * tile boundary.
  943|       |	 */
  944|  8.76k|	block_cache->max_tiles = VIPS_MAX(2, // FIXME: Invalidates operation cache
  ------------------
  |  |   54|  8.76k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 8.76k]
  |  |  ------------------
  ------------------
  945|  8.76k|		4 * n_lines / block_cache->tile_height);
  946|       |
  947|  8.76k|	VIPS_DEBUG_MSG("vips_line_cache_build: n_lines = %d\n",
  ------------------
  |  |   47|  8.76k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.76k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  8.76k|	{ \
  |  |   49|  8.76k|		; \
  |  |   50|  8.76k|	} \
  |  |   51|  8.76k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.76k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  948|  8.76k|		n_lines);
  949|  8.76k|	VIPS_DEBUG_MSG("vips_line_cache_build: max_tiles = %d\n",
  ------------------
  |  |   47|  8.76k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.76k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  8.76k|	{ \
  |  |   49|  8.76k|		; \
  |  |   50|  8.76k|	} \
  |  |   51|  8.76k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.76k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  950|  8.76k|		block_cache->max_tiles);
  951|  8.76k|	VIPS_DEBUG_MSG("vips_line_cache_build: tile_height = %d\n",
  ------------------
  |  |   47|  8.76k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.76k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  8.76k|	{ \
  |  |   49|  8.76k|		; \
  |  |   50|  8.76k|	} \
  |  |   51|  8.76k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.76k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  952|  8.76k|		block_cache->tile_height);
  953|  8.76k|	VIPS_DEBUG_MSG("vips_line_cache_build: max size = %g MB\n",
  ------------------
  |  |   47|  8.76k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.76k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  8.76k|	{ \
  |  |   49|  8.76k|		; \
  |  |   50|  8.76k|	} \
  |  |   51|  8.76k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.76k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  954|  8.76k|		(block_cache->max_tiles *
  955|  8.76k|			block_cache->tile_width *
  956|  8.76k|			block_cache->tile_height *
  957|  8.76k|			VIPS_IMAGE_SIZEOF_PEL(block_cache->in)) /
  958|  8.76k|			(1024 * 1024.0));
  959|       |
  960|  8.76k|	if (vips_image_pio_input(block_cache->in))
  ------------------
  |  Branch (960:6): [True: 0, False: 8.76k]
  ------------------
  961|      0|		return -1;
  962|       |
  963|  8.76k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (963:6): [True: 0, False: 8.76k]
  ------------------
  964|  8.76k|			VIPS_DEMAND_STYLE_THINSTRIP, block_cache->in, NULL))
  965|      0|		return -1;
  966|       |
  967|  8.76k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (967:6): [True: 0, False: 8.76k]
  ------------------
  968|  8.76k|			vips_start_one, vips_line_cache_gen, vips_stop_one,
  969|  8.76k|			block_cache->in, cache))
  970|      0|		return -1;
  971|       |
  972|  8.76k|	return 0;
  973|  8.76k|}
tilecache.c:vips_line_cache_gen:
  887|  19.1k|{
  888|  19.1k|	VipsBlockCache *block_cache = (VipsBlockCache *) b;
  889|       |
  890|  19.1k|	VIPS_GATE_START("vips_line_cache_gen: wait");
  ------------------
  |  |   41|  19.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  19.1k|	{ \
  |  |   43|  19.1k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 19.1k]
  |  |  ------------------
  |  |   44|  19.1k|			vips__thread_gate_start(NAME); \
  |  |   45|  19.1k|	} \
  |  |   46|  19.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  891|       |
  892|  19.1k|	vips__worker_lock(block_cache->lock);
  893|       |
  894|  19.1k|	VIPS_GATE_STOP("vips_line_cache_gen: wait");
  ------------------
  |  |   49|  19.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  19.1k|	{ \
  |  |   51|  19.1k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 19.1k]
  |  |  ------------------
  |  |   52|  19.1k|			vips__thread_gate_stop(NAME); \
  |  |   53|  19.1k|	} \
  |  |   54|  19.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  895|       |
  896|       |	/* We size up the cache to the largest request.
  897|       |	 */
  898|  19.1k|	if (out_region->valid.height >
  ------------------
  |  Branch (898:6): [True: 0, False: 19.1k]
  ------------------
  899|  19.1k|		block_cache->max_tiles * block_cache->tile_height) {
  900|      0|		block_cache->max_tiles = // FIXME: Invalidates operation cache
  901|      0|			1 + (out_region->valid.height / block_cache->tile_height);
  902|      0|		VIPS_DEBUG_MSG("vips_line_cache_gen: bumped max_tiles to %d\n",
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  903|      0|			block_cache->max_tiles);
  904|      0|	}
  905|       |
  906|  19.1k|	g_mutex_unlock(block_cache->lock);
  907|       |
  908|  19.1k|	return vips_tile_cache_gen(out_region, seq, a, b, stop);
  909|  19.1k|}
tilecache.c:vips_line_cache_init:
  989|  8.76k|{
  990|  8.76k|}

transpose3d.c:vips_transpose3d_class_init:
  155|      1|{
  156|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  157|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  158|       |
  159|      1|	gobject_class->set_property = vips_object_set_property;
  160|      1|	gobject_class->get_property = vips_object_get_property;
  161|       |
  162|      1|	vobject_class->nickname = "transpose3d";
  163|      1|	vobject_class->description = _("transpose3d an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  164|      1|	vobject_class->build = vips_transpose3d_build;
  165|       |
  166|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  167|      1|		_("Input"),
  168|      1|		_("Input image"),
  169|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  170|      1|		G_STRUCT_OFFSET(VipsTranspose3d, in));
  171|       |
  172|      1|	VIPS_ARG_INT(class, "page_height", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  173|      1|		_("Page height"),
  174|      1|		_("Height of each input page"),
  175|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  176|      1|		G_STRUCT_OFFSET(VipsTranspose3d, page_height),
  177|      1|		0, 10000000, 0);
  178|      1|}

vips_unpremultiply:
  393|    607|{
  394|    607|	va_list ap;
  395|    607|	int result;
  396|       |
  397|    607|	va_start(ap, out);
  398|    607|	result = vips_call_split("unpremultiply", ap, in, out);
  399|    607|	va_end(ap);
  400|       |
  401|    607|	return result;
  402|    607|}
unpremultiply.c:vips_unpremultiply_class_init:
  306|      1|{
  307|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  308|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  309|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  310|       |
  311|      1|	VIPS_DEBUG_MSG("vips_unpremultiply_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  312|       |
  313|      1|	gobject_class->set_property = vips_object_set_property;
  314|      1|	gobject_class->get_property = vips_object_get_property;
  315|       |
  316|      1|	vobject_class->nickname = "unpremultiply";
  317|      1|	vobject_class->description = _("unpremultiply image alpha");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  318|      1|	vobject_class->build = vips_unpremultiply_build;
  319|       |
  320|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  321|       |
  322|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  323|      1|		_("Input"),
  324|      1|		_("Input image"),
  325|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  326|      1|		G_STRUCT_OFFSET(VipsUnpremultiply, in));
  327|       |
  328|      1|	VIPS_ARG_DOUBLE(class, "max_alpha", 115,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  329|      1|		_("Maximum alpha"),
  330|      1|		_("Maximum value of alpha channel"),
  331|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  332|      1|		G_STRUCT_OFFSET(VipsUnpremultiply, max_alpha),
  333|      1|		0, 100000000, 255);
  334|       |
  335|      1|	VIPS_ARG_INT(class, "alpha_band", 116,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  336|      1|		_("Alpha band"),
  337|      1|		_("Unpremultiply with this alpha"),
  338|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  339|      1|		G_STRUCT_OFFSET(VipsUnpremultiply, alpha_band),
  340|      1|		0, 100000000, 3);
  341|      1|}
unpremultiply.c:vips_unpremultiply_build:
  251|    607|{
  252|    607|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    607|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    607|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    607|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  253|    607|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|    607|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    607|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    607|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|    607|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  254|    607|	VipsUnpremultiply *unpremultiply = (VipsUnpremultiply *) object;
  255|    607|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 1);
  256|       |
  257|    607|	VipsImage *in;
  258|       |
  259|    607|	if (VIPS_OBJECT_CLASS(vips_unpremultiply_parent_class)->build(object))
  ------------------
  |  |  435|    607|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    607|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    607|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (259:6): [True: 0, False: 607]
  ------------------
  260|      0|		return -1;
  261|       |
  262|    607|	in = unpremultiply->in;
  263|       |
  264|    607|	if (vips_image_decode(in, &t[0]))
  ------------------
  |  Branch (264:6): [True: 0, False: 607]
  ------------------
  265|      0|		return -1;
  266|    607|	in = t[0];
  267|       |
  268|       |	/* Trivial case: fall back to copy().
  269|       |	 */
  270|    607|	if (in->Bands == 1)
  ------------------
  |  Branch (270:6): [True: 29, False: 578]
  ------------------
  271|     29|		return vips_image_write(in, conversion->out);
  272|       |
  273|    578|	if (vips_check_noncomplex(class->nickname, in))
  ------------------
  |  Branch (273:6): [True: 0, False: 578]
  ------------------
  274|      0|		return -1;
  275|       |
  276|    578|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (276:6): [True: 0, False: 578]
  ------------------
  277|    578|			VIPS_DEMAND_STYLE_THINSTRIP, in, NULL))
  278|      0|		return -1;
  279|       |
  280|       |	/* Is max-alpha unset? Default to the correct value for this
  281|       |	 * interpretation.
  282|       |	 */
  283|    578|	if (!vips_object_argument_isset(object, "max_alpha"))
  ------------------
  |  Branch (283:6): [True: 578, False: 0]
  ------------------
  284|    578|		unpremultiply->max_alpha = vips_interpretation_max_alpha(in->Type); // FIXME: Invalidates operation cache
  285|       |
  286|       |	/* Is alpha-band unset? Default to the final band for this image.
  287|       |	 */
  288|    578|	if (!vips_object_argument_isset(object, "alpha_band"))
  ------------------
  |  Branch (288:6): [True: 0, False: 578]
  ------------------
  289|      0|		unpremultiply->alpha_band = in->Bands - 1; // FIXME: Invalidates operation cache
  290|       |
  291|    578|	if (in->BandFmt == VIPS_FORMAT_DOUBLE)
  ------------------
  |  Branch (291:6): [True: 0, False: 578]
  ------------------
  292|      0|		conversion->out->BandFmt = VIPS_FORMAT_DOUBLE;
  293|    578|	else
  294|    578|		conversion->out->BandFmt = VIPS_FORMAT_FLOAT;
  295|       |
  296|    578|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (296:6): [True: 0, False: 578]
  ------------------
  297|    578|			vips_start_one, vips_unpremultiply_gen, vips_stop_one,
  298|    578|			in, unpremultiply))
  299|      0|		return -1;
  300|       |
  301|    578|	return 0;
  302|    578|}
unpremultiply.c:vips_unpremultiply_init:
  345|    607|{
  346|    607|	unpremultiply->max_alpha = 255.0;
  347|    607|}
unpremultiply.c:vips_unpremultiply_gen.avx.0:
  187|  1.51k|{
  188|  1.51k|	VipsUnpremultiply *unpremultiply = (VipsUnpremultiply *) b;
  189|  1.51k|	VipsRegion *ir = (VipsRegion *) vseq;
  190|  1.51k|	VipsImage *im = ir->im;
  191|  1.51k|	VipsRect *r = &out_region->valid;
  192|  1.51k|	int width = r->width;
  193|  1.51k|	int bands = im->Bands;
  194|  1.51k|	double max_alpha = unpremultiply->max_alpha;
  195|  1.51k|	int alpha_band = unpremultiply->alpha_band;
  196|       |
  197|  1.51k|	int x, y, i;
  198|       |
  199|  1.51k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (199:6): [True: 90, False: 1.42k]
  ------------------
  200|     90|		return -1;
  201|       |
  202|  21.0k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (202:14): [True: 19.6k, False: 1.42k]
  ------------------
  203|  19.6k|		VipsPel *in = VIPS_REGION_ADDR(ir, r->left, r->top + y);
  ------------------
  |  |  227|  19.6k|	((R)->data + \
  |  |  228|  19.6k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  19.6k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  19.6k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  19.6k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  19.6k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  19.6k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  204|  19.6k|		VipsPel *out = VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|  19.6k|	((R)->data + \
  |  |  228|  19.6k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  19.6k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  19.6k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  19.6k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  19.6k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  19.6k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|       |
  206|  19.6k|		switch (im->BandFmt) {
  207|  2.02k|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (207:3): [True: 2.02k, False: 17.5k]
  ------------------
  208|  2.02k|			UNPRE(unsigned char, float);
  ------------------
  |  |  122|  2.02k|	{ \
  |  |  123|  2.02k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 1.50k, False: 519]
  |  |  ------------------
  |  |  124|  1.50k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  1.50k|	{ \
  |  |  |  |  104|  1.50k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  1.50k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  1.50k|\
  |  |  |  |  107|  56.9k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 55.4k, False: 1.50k]
  |  |  |  |  ------------------
  |  |  |  |  108|  55.4k|			IN alpha = p[3]; \
  |  |  |  |  109|  55.4k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 13.0k, False: 42.4k]
  |  |  |  |  ------------------
  |  |  |  |  110|  55.4k|\
  |  |  |  |  111|  55.4k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  55.4k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  55.4k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  55.4k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  55.4k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   110k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 55.4k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 55.4k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 55.4k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  55.4k|\
  |  |  |  |  116|  55.4k|			p += 4; \
  |  |  |  |  117|  55.4k|			q += 4; \
  |  |  |  |  118|  55.4k|		} \
  |  |  |  |  119|  1.50k|	}
  |  |  ------------------
  |  |  125|  1.50k|		} \
  |  |  126|  2.02k|		else { \
  |  |  127|    519|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|    519|	{ \
  |  |  |  |   82|    519|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|    519|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|    519|\
  |  |  |  |   85|  23.9k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 23.4k, False: 519]
  |  |  |  |  ------------------
  |  |  |  |   86|  23.4k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|  23.4k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 21.8k, False: 1.60k]
  |  |  |  |  ------------------
  |  |  |  |   88|  23.4k|\
  |  |  |  |   89|  47.9k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 24.5k, False: 23.4k]
  |  |  |  |  ------------------
  |  |  |  |   90|  24.5k|				q[i] = factor * p[i]; \
  |  |  |  |   91|  23.4k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  23.4k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  46.8k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 23.4k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 23.4k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 23.4k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|  43.9k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 20.5k, False: 23.4k]
  |  |  |  |  ------------------
  |  |  |  |   93|  23.4k|				q[i] = p[i]; \
  |  |  |  |   94|  23.4k|\
  |  |  |  |   95|  23.4k|			p += bands; \
  |  |  |  |   96|  23.4k|			q += bands; \
  |  |  |  |   97|  23.4k|		} \
  |  |  |  |   98|    519|	}
  |  |  ------------------
  |  |  128|    519|		} \
  |  |  129|  2.02k|	}
  ------------------
  209|  2.02k|			break;
  210|       |
  211|  2.67k|		case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (211:3): [True: 2.67k, False: 16.9k]
  ------------------
  212|  2.67k|			UNPRE(signed char, float);
  ------------------
  |  |  122|  2.67k|	{ \
  |  |  123|  2.67k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 1.25k, False: 1.42k]
  |  |  ------------------
  |  |  124|  1.25k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  1.25k|	{ \
  |  |  |  |  104|  1.25k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  1.25k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  1.25k|\
  |  |  |  |  107|  58.7k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 57.4k, False: 1.25k]
  |  |  |  |  ------------------
  |  |  |  |  108|  57.4k|			IN alpha = p[3]; \
  |  |  |  |  109|  57.4k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 51.2k, False: 6.24k]
  |  |  |  |  ------------------
  |  |  |  |  110|  57.4k|\
  |  |  |  |  111|  57.4k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  57.4k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  57.4k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  57.4k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  57.4k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   114k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 3.97k, False: 53.5k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 57.4k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 53.5k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  57.4k|\
  |  |  |  |  116|  57.4k|			p += 4; \
  |  |  |  |  117|  57.4k|			q += 4; \
  |  |  |  |  118|  57.4k|		} \
  |  |  |  |  119|  1.25k|	}
  |  |  ------------------
  |  |  125|  1.25k|		} \
  |  |  126|  2.67k|		else { \
  |  |  127|  1.42k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  1.42k|	{ \
  |  |  |  |   82|  1.42k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  1.42k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  1.42k|\
  |  |  |  |   85|  57.4k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 56.0k, False: 1.42k]
  |  |  |  |  ------------------
  |  |  |  |   86|  56.0k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|  56.0k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 24.2k, False: 31.7k]
  |  |  |  |  ------------------
  |  |  |  |   88|  56.0k|\
  |  |  |  |   89|   155k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 99.3k, False: 56.0k]
  |  |  |  |  ------------------
  |  |  |  |   90|  99.3k|				q[i] = factor * p[i]; \
  |  |  |  |   91|  56.0k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  56.0k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   112k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 7.28k, False: 48.7k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 56.0k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 48.7k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|  68.7k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 12.7k, False: 56.0k]
  |  |  |  |  ------------------
  |  |  |  |   93|  56.0k|				q[i] = p[i]; \
  |  |  |  |   94|  56.0k|\
  |  |  |  |   95|  56.0k|			p += bands; \
  |  |  |  |   96|  56.0k|			q += bands; \
  |  |  |  |   97|  56.0k|		} \
  |  |  |  |   98|  1.42k|	}
  |  |  ------------------
  |  |  128|  1.42k|		} \
  |  |  129|  2.67k|	}
  ------------------
  213|  2.67k|			break;
  214|       |
  215|  1.98k|		case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (215:3): [True: 1.98k, False: 17.6k]
  ------------------
  216|  1.98k|			UNPRE(unsigned short, float);
  ------------------
  |  |  122|  1.98k|	{ \
  |  |  123|  1.98k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 743, False: 1.23k]
  |  |  ------------------
  |  |  124|    743|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|    743|	{ \
  |  |  |  |  104|    743|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|    743|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|    743|\
  |  |  |  |  107|  4.37k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 3.63k, False: 743]
  |  |  |  |  ------------------
  |  |  |  |  108|  3.63k|			IN alpha = p[3]; \
  |  |  |  |  109|  3.63k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 1.74k, False: 1.89k]
  |  |  |  |  ------------------
  |  |  |  |  110|  3.63k|\
  |  |  |  |  111|  3.63k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  3.63k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  3.63k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  3.63k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  3.63k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  7.27k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 3.63k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 1.35k, False: 2.27k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 1.35k, False: 2.27k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  3.63k|\
  |  |  |  |  116|  3.63k|			p += 4; \
  |  |  |  |  117|  3.63k|			q += 4; \
  |  |  |  |  118|  3.63k|		} \
  |  |  |  |  119|    743|	}
  |  |  ------------------
  |  |  125|    743|		} \
  |  |  126|  1.98k|		else { \
  |  |  127|  1.23k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  1.23k|	{ \
  |  |  |  |   82|  1.23k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  1.23k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  1.23k|\
  |  |  |  |   85|  74.5k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 73.3k, False: 1.23k]
  |  |  |  |  ------------------
  |  |  |  |   86|  73.3k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|  73.3k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 30.0k, False: 43.2k]
  |  |  |  |  ------------------
  |  |  |  |   88|  73.3k|\
  |  |  |  |   89|   205k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 132k, False: 73.3k]
  |  |  |  |  ------------------
  |  |  |  |   90|   132k|				q[i] = factor * p[i]; \
  |  |  |  |   91|  73.3k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  73.3k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   146k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 73.3k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 33.7k, False: 39.5k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 33.7k, False: 39.5k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|  85.8k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 12.4k, False: 73.3k]
  |  |  |  |  ------------------
  |  |  |  |   93|  73.3k|				q[i] = p[i]; \
  |  |  |  |   94|  73.3k|\
  |  |  |  |   95|  73.3k|			p += bands; \
  |  |  |  |   96|  73.3k|			q += bands; \
  |  |  |  |   97|  73.3k|		} \
  |  |  |  |   98|  1.23k|	}
  |  |  ------------------
  |  |  128|  1.23k|		} \
  |  |  129|  1.98k|	}
  ------------------
  217|  1.98k|			break;
  218|       |
  219|  2.08k|		case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (219:3): [True: 2.08k, False: 17.5k]
  ------------------
  220|  2.08k|			UNPRE(signed short, float);
  ------------------
  |  |  122|  2.08k|	{ \
  |  |  123|  2.08k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 1.13k, False: 949]
  |  |  ------------------
  |  |  124|  1.13k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  1.13k|	{ \
  |  |  |  |  104|  1.13k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  1.13k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  1.13k|\
  |  |  |  |  107|  49.0k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 47.8k, False: 1.13k]
  |  |  |  |  ------------------
  |  |  |  |  108|  47.8k|			IN alpha = p[3]; \
  |  |  |  |  109|  47.8k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 32.8k, False: 14.9k]
  |  |  |  |  ------------------
  |  |  |  |  110|  47.8k|\
  |  |  |  |  111|  47.8k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  47.8k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  47.8k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  47.8k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  47.8k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  95.7k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 10.9k, False: 36.8k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 3.99k, False: 43.8k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 3.99k, False: 32.8k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  47.8k|\
  |  |  |  |  116|  47.8k|			p += 4; \
  |  |  |  |  117|  47.8k|			q += 4; \
  |  |  |  |  118|  47.8k|		} \
  |  |  |  |  119|  1.13k|	}
  |  |  ------------------
  |  |  125|  1.13k|		} \
  |  |  126|  2.08k|		else { \
  |  |  127|    949|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|    949|	{ \
  |  |  |  |   82|    949|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|    949|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|    949|\
  |  |  |  |   85|  30.2k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 29.3k, False: 949]
  |  |  |  |  ------------------
  |  |  |  |   86|  29.3k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|  29.3k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 17.9k, False: 11.3k]
  |  |  |  |  ------------------
  |  |  |  |   88|  29.3k|\
  |  |  |  |   89|  83.6k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 54.3k, False: 29.3k]
  |  |  |  |  ------------------
  |  |  |  |   90|  54.3k|				q[i] = factor * p[i]; \
  |  |  |  |   91|  29.3k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  29.3k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  58.6k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 9.00k, False: 20.3k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 1.90k, False: 27.4k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 1.90k, False: 18.4k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|  31.4k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 2.16k, False: 29.3k]
  |  |  |  |  ------------------
  |  |  |  |   93|  29.3k|				q[i] = p[i]; \
  |  |  |  |   94|  29.3k|\
  |  |  |  |   95|  29.3k|			p += bands; \
  |  |  |  |   96|  29.3k|			q += bands; \
  |  |  |  |   97|  29.3k|		} \
  |  |  |  |   98|    949|	}
  |  |  ------------------
  |  |  128|    949|		} \
  |  |  129|  2.08k|	}
  ------------------
  221|  2.08k|			break;
  222|       |
  223|  2.03k|		case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (223:3): [True: 2.03k, False: 17.5k]
  ------------------
  224|  2.03k|			UNPRE(unsigned int, float);
  ------------------
  |  |  122|  2.03k|	{ \
  |  |  123|  2.03k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 875, False: 1.16k]
  |  |  ------------------
  |  |  124|    875|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|    875|	{ \
  |  |  |  |  104|    875|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|    875|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|    875|\
  |  |  |  |  107|  10.0k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 9.18k, False: 875]
  |  |  |  |  ------------------
  |  |  |  |  108|  9.18k|			IN alpha = p[3]; \
  |  |  |  |  109|  9.18k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 507, False: 8.67k]
  |  |  |  |  ------------------
  |  |  |  |  110|  9.18k|\
  |  |  |  |  111|  9.18k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  9.18k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  9.18k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  9.18k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  9.18k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  18.3k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 9.18k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 8.12k, False: 1.06k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 8.12k, False: 1.06k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  9.18k|\
  |  |  |  |  116|  9.18k|			p += 4; \
  |  |  |  |  117|  9.18k|			q += 4; \
  |  |  |  |  118|  9.18k|		} \
  |  |  |  |  119|    875|	}
  |  |  ------------------
  |  |  125|    875|		} \
  |  |  126|  2.03k|		else { \
  |  |  127|  1.16k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  1.16k|	{ \
  |  |  |  |   82|  1.16k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  1.16k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  1.16k|\
  |  |  |  |   85|  18.3k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 17.1k, False: 1.16k]
  |  |  |  |  ------------------
  |  |  |  |   86|  17.1k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|  17.1k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 3.44k, False: 13.7k]
  |  |  |  |  ------------------
  |  |  |  |   88|  17.1k|\
  |  |  |  |   89|  49.2k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 32.0k, False: 17.1k]
  |  |  |  |  ------------------
  |  |  |  |   90|  32.0k|				q[i] = factor * p[i]; \
  |  |  |  |   91|  17.1k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  17.1k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  34.3k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 17.1k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 13.2k, False: 3.95k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 13.2k, False: 3.95k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|  19.5k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 2.39k, False: 17.1k]
  |  |  |  |  ------------------
  |  |  |  |   93|  17.1k|				q[i] = p[i]; \
  |  |  |  |   94|  17.1k|\
  |  |  |  |   95|  17.1k|			p += bands; \
  |  |  |  |   96|  17.1k|			q += bands; \
  |  |  |  |   97|  17.1k|		} \
  |  |  |  |   98|  1.16k|	}
  |  |  ------------------
  |  |  128|  1.16k|		} \
  |  |  129|  2.03k|	}
  ------------------
  225|  2.03k|			break;
  226|       |
  227|  3.59k|		case VIPS_FORMAT_INT:
  ------------------
  |  Branch (227:3): [True: 3.59k, False: 16.0k]
  ------------------
  228|  3.59k|			UNPRE(signed int, float);
  ------------------
  |  |  122|  3.59k|	{ \
  |  |  123|  3.59k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 2.35k, False: 1.24k]
  |  |  ------------------
  |  |  124|  2.35k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  2.35k|	{ \
  |  |  |  |  104|  2.35k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  2.35k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  2.35k|\
  |  |  |  |  107|  78.4k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 76.1k, False: 2.35k]
  |  |  |  |  ------------------
  |  |  |  |  108|  76.1k|			IN alpha = p[3]; \
  |  |  |  |  109|  76.1k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 13.8k, False: 62.2k]
  |  |  |  |  ------------------
  |  |  |  |  110|  76.1k|\
  |  |  |  |  111|  76.1k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  76.1k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  76.1k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  76.1k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  76.1k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   152k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 11.5k, False: 64.5k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 47.2k, False: 28.8k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 47.2k, False: 17.2k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  76.1k|\
  |  |  |  |  116|  76.1k|			p += 4; \
  |  |  |  |  117|  76.1k|			q += 4; \
  |  |  |  |  118|  76.1k|		} \
  |  |  |  |  119|  2.35k|	}
  |  |  ------------------
  |  |  125|  2.35k|		} \
  |  |  126|  3.59k|		else { \
  |  |  127|  1.24k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  1.24k|	{ \
  |  |  |  |   82|  1.24k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  1.24k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  1.24k|\
  |  |  |  |   85|  20.5k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 19.2k, False: 1.24k]
  |  |  |  |  ------------------
  |  |  |  |   86|  19.2k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|  19.2k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 4.57k, False: 14.7k]
  |  |  |  |  ------------------
  |  |  |  |   88|  19.2k|\
  |  |  |  |   89|  54.0k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 34.7k, False: 19.2k]
  |  |  |  |  ------------------
  |  |  |  |   90|  34.7k|				q[i] = factor * p[i]; \
  |  |  |  |   91|  19.2k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  19.2k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  38.5k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 4.91k, False: 14.3k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 9.35k, False: 9.93k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 9.35k, False: 5.01k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|  23.0k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 3.80k, False: 19.2k]
  |  |  |  |  ------------------
  |  |  |  |   93|  19.2k|				q[i] = p[i]; \
  |  |  |  |   94|  19.2k|\
  |  |  |  |   95|  19.2k|			p += bands; \
  |  |  |  |   96|  19.2k|			q += bands; \
  |  |  |  |   97|  19.2k|		} \
  |  |  |  |   98|  1.24k|	}
  |  |  ------------------
  |  |  128|  1.24k|		} \
  |  |  129|  3.59k|	}
  ------------------
  229|  3.59k|			break;
  230|       |
  231|  5.20k|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (231:3): [True: 5.20k, False: 14.3k]
  ------------------
  232|  5.20k|			FUNPRE(float, float);
  ------------------
  |  |  174|  5.20k|	{ \
  |  |  175|  5.20k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (175:7): [True: 1.43k, False: 3.77k]
  |  |  ------------------
  |  |  176|  1.43k|			FUNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  155|  1.43k|	{ \
  |  |  |  |  156|  1.43k|		IN *restrict p = (IN *) in; \
  |  |  |  |  157|  1.43k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  158|  1.43k|\
  |  |  |  |  159|  18.8k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (159:15): [True: 17.4k, False: 1.43k]
  |  |  |  |  ------------------
  |  |  |  |  160|  17.4k|			IN alpha = p[3]; \
  |  |  |  |  161|  17.4k|			OUT factor = VIPS_ABS(alpha) < 0.01 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  |   62|  17.4k|#define VIPS_ABS(X) (((X) >= 0) ? (X) : -(X))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (62:22): [True: 16.7k, False: 663]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (161:17): [True: 16.3k, False: 1.02k]
  |  |  |  |  ------------------
  |  |  |  |  162|  17.4k|\
  |  |  |  |  163|  17.4k|			q[0] = factor * p[0]; \
  |  |  |  |  164|  17.4k|			q[1] = factor * p[1]; \
  |  |  |  |  165|  17.4k|			q[2] = factor * p[2]; \
  |  |  |  |  166|  17.4k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  17.4k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  34.8k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 446, False: 16.9k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 177, False: 17.2k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 177, False: 16.7k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  167|  17.4k|\
  |  |  |  |  168|  17.4k|			p += 4; \
  |  |  |  |  169|  17.4k|			q += 4; \
  |  |  |  |  170|  17.4k|		} \
  |  |  |  |  171|  1.43k|	}
  |  |  ------------------
  |  |  177|  1.43k|		} \
  |  |  178|  5.20k|		else { \
  |  |  179|  3.77k|			FUNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |  135|  3.77k|	{ \
  |  |  |  |  136|  3.77k|		IN *restrict p = (IN *) in; \
  |  |  |  |  137|  3.77k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  138|  3.77k|\
  |  |  |  |  139|   321k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (139:15): [True: 318k, False: 3.77k]
  |  |  |  |  ------------------
  |  |  |  |  140|   318k|			IN alpha = p[alpha_band]; \
  |  |  |  |  141|   318k|			OUT factor = VIPS_ABS(alpha) < 0.01 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  |   62|   318k|#define VIPS_ABS(X) (((X) >= 0) ? (X) : -(X))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (62:22): [True: 272k, False: 45.6k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (141:17): [True: 249k, False: 68.1k]
  |  |  |  |  ------------------
  |  |  |  |  142|   318k|\
  |  |  |  |  143|   918k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (143:16): [True: 600k, False: 318k]
  |  |  |  |  ------------------
  |  |  |  |  144|   600k|				q[i] = factor * p[i]; \
  |  |  |  |  145|   318k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   318k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   636k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 45.6k, False: 272k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 9.91k, False: 308k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 9.91k, False: 262k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  146|   354k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (146:29): [True: 36.0k, False: 318k]
  |  |  |  |  ------------------
  |  |  |  |  147|   318k|				q[i] = p[i]; \
  |  |  |  |  148|   318k|\
  |  |  |  |  149|   318k|			p += bands; \
  |  |  |  |  150|   318k|			q += bands; \
  |  |  |  |  151|   318k|		} \
  |  |  |  |  152|  3.77k|	}
  |  |  ------------------
  |  |  180|  3.77k|		} \
  |  |  181|  5.20k|	}
  ------------------
  233|  5.20k|			break;
  234|       |
  235|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (235:3): [True: 0, False: 19.6k]
  ------------------
  236|      0|			FUNPRE(double, double);
  ------------------
  |  |  174|      0|	{ \
  |  |  175|      0|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (175:7): [True: 0, False: 0]
  |  |  ------------------
  |  |  176|      0|			FUNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  155|      0|	{ \
  |  |  |  |  156|      0|		IN *restrict p = (IN *) in; \
  |  |  |  |  157|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  158|      0|\
  |  |  |  |  159|      0|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (159:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  160|      0|			IN alpha = p[3]; \
  |  |  |  |  161|      0|			OUT factor = VIPS_ABS(alpha) < 0.01 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  |   62|      0|#define VIPS_ABS(X) (((X) >= 0) ? (X) : -(X))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (62:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (161:17): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  162|      0|\
  |  |  |  |  163|      0|			q[0] = factor * p[0]; \
  |  |  |  |  164|      0|			q[1] = factor * p[1]; \
  |  |  |  |  165|      0|			q[2] = factor * p[2]; \
  |  |  |  |  166|      0|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  167|      0|\
  |  |  |  |  168|      0|			p += 4; \
  |  |  |  |  169|      0|			q += 4; \
  |  |  |  |  170|      0|		} \
  |  |  |  |  171|      0|	}
  |  |  ------------------
  |  |  177|      0|		} \
  |  |  178|      0|		else { \
  |  |  179|      0|			FUNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |  135|      0|	{ \
  |  |  |  |  136|      0|		IN *restrict p = (IN *) in; \
  |  |  |  |  137|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  138|      0|\
  |  |  |  |  139|      0|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (139:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  140|      0|			IN alpha = p[alpha_band]; \
  |  |  |  |  141|      0|			OUT factor = VIPS_ABS(alpha) < 0.01 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  |   62|      0|#define VIPS_ABS(X) (((X) >= 0) ? (X) : -(X))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (62:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (141:17): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  142|      0|\
  |  |  |  |  143|      0|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (143:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  144|      0|				q[i] = factor * p[i]; \
  |  |  |  |  145|      0|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  146|      0|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (146:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  147|      0|				q[i] = p[i]; \
  |  |  |  |  148|      0|\
  |  |  |  |  149|      0|			p += bands; \
  |  |  |  |  150|      0|			q += bands; \
  |  |  |  |  151|      0|		} \
  |  |  |  |  152|      0|	}
  |  |  ------------------
  |  |  180|      0|		} \
  |  |  181|      0|	}
  ------------------
  237|      0|			break;
  238|       |
  239|      0|		case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (239:3): [True: 0, False: 19.6k]
  ------------------
  240|      0|		case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (240:3): [True: 0, False: 19.6k]
  ------------------
  241|      0|		default:
  ------------------
  |  Branch (241:3): [True: 0, False: 19.6k]
  ------------------
  242|      0|			g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  243|  19.6k|		}
  244|  19.6k|	}
  245|       |
  246|  1.42k|	return 0;
  247|  1.42k|}

wrap.c:vips_wrap_class_init:
  107|      1|{
  108|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  109|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  110|       |
  111|      1|	gobject_class->set_property = vips_object_set_property;
  112|      1|	gobject_class->get_property = vips_object_get_property;
  113|       |
  114|      1|	vobject_class->nickname = "wrap";
  115|      1|	vobject_class->description = _("wrap image origin");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  116|      1|	vobject_class->build = vips_wrap_build;
  117|       |
  118|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  119|      1|		_("Input"),
  120|      1|		_("Input image"),
  121|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  122|      1|		G_STRUCT_OFFSET(VipsWrap, in));
  123|       |
  124|      1|	VIPS_ARG_INT(class, "x", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  125|      1|		_("x"),
  126|      1|		_("Left edge of input in output"),
  127|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  128|      1|		G_STRUCT_OFFSET(VipsWrap, x),
  129|      1|		-VIPS_MAX_COORD, VIPS_MAX_COORD, 0);
  130|       |
  131|      1|	VIPS_ARG_INT(class, "y", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  132|      1|		_("y"),
  133|      1|		_("Top edge of input in output"),
  134|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  135|      1|		G_STRUCT_OFFSET(VipsWrap, y),
  136|      1|		-VIPS_MAX_COORD, VIPS_MAX_COORD, 0);
  137|      1|}

zoom.c:vips_zoom_class_init:
  358|      1|{
  359|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  360|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  361|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  362|       |
  363|      1|	gobject_class->set_property = vips_object_set_property;
  364|      1|	gobject_class->get_property = vips_object_get_property;
  365|       |
  366|      1|	vobject_class->nickname = "zoom";
  367|      1|	vobject_class->description = _("zoom an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  368|      1|	vobject_class->build = vips_zoom_build;
  369|       |
  370|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  371|       |
  372|      1|	VIPS_ARG_IMAGE(class, "input", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  373|      1|		_("Input"),
  374|      1|		_("Input image"),
  375|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  376|      1|		G_STRUCT_OFFSET(VipsZoom, in));
  377|       |
  378|      1|	VIPS_ARG_INT(class, "xfac", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  379|      1|		_("Xfac"),
  380|      1|		_("Horizontal zoom factor"),
  381|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  382|      1|		G_STRUCT_OFFSET(VipsZoom, xfac),
  383|      1|		1, VIPS_MAX_COORD, 1);
  384|       |
  385|      1|	VIPS_ARG_INT(class, "yfac", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  386|      1|		_("Yfac"),
  387|      1|		_("Vertical zoom factor"),
  388|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  389|      1|		G_STRUCT_OFFSET(VipsZoom, yfac),
  390|      1|		1, VIPS_MAX_COORD, 1);
  391|      1|}

canny.c:vips_canny_class_init:
  427|      1|{
  428|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  429|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  430|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  431|       |
  432|      1|	gobject_class->set_property = vips_object_set_property;
  433|      1|	gobject_class->get_property = vips_object_get_property;
  434|       |
  435|      1|	object_class->nickname = "canny";
  436|      1|	object_class->description = _("Canny edge detector");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  437|      1|	object_class->build = vips_canny_build;
  438|       |
  439|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  440|       |
  441|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  442|      1|		_("Input"),
  443|      1|		_("Input image"),
  444|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  445|      1|		G_STRUCT_OFFSET(VipsCanny, in));
  446|       |
  447|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  448|      1|		_("Output"),
  449|      1|		_("Output image"),
  450|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  451|      1|		G_STRUCT_OFFSET(VipsCanny, out));
  452|       |
  453|      1|	VIPS_ARG_DOUBLE(class, "sigma", 10,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  454|      1|		_("Sigma"),
  455|      1|		_("Sigma of Gaussian"),
  456|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  457|      1|		G_STRUCT_OFFSET(VipsCanny, sigma),
  458|      1|		0.01, 1000, 1.4);
  459|       |
  460|      1|	VIPS_ARG_ENUM(class, "precision", 103,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  461|      1|		_("Precision"),
  462|      1|		_("Convolve with this precision"),
  463|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  464|      1|		G_STRUCT_OFFSET(VipsCanny, precision),
  465|      1|		VIPS_TYPE_PRECISION, VIPS_PRECISION_FLOAT);
  466|      1|}

compass.c:vips_compass_class_init:
  151|      1|{
  152|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  153|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  154|       |
  155|      1|	gobject_class->set_property = vips_object_set_property;
  156|      1|	gobject_class->get_property = vips_object_get_property;
  157|       |
  158|      1|	object_class->nickname = "compass";
  159|      1|	object_class->description = _("convolve with rotating mask");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  160|      1|	object_class->build = vips_compass_build;
  161|       |
  162|      1|	VIPS_ARG_INT(class, "times", 101,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  163|      1|		_("Times"),
  164|      1|		_("Rotate and convolve this many times"),
  165|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  166|      1|		G_STRUCT_OFFSET(VipsCompass, times),
  167|      1|		1, 1000, 2);
  168|       |
  169|      1|	VIPS_ARG_ENUM(class, "angle", 103,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  170|      1|		_("Angle"),
  171|      1|		_("Rotate mask by this much between convolutions"),
  172|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  173|      1|		G_STRUCT_OFFSET(VipsCompass, angle),
  174|      1|		VIPS_TYPE_ANGLE45, VIPS_ANGLE45_D90);
  175|       |
  176|      1|	VIPS_ARG_ENUM(class, "combine", 104,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  177|      1|		_("Combine"),
  178|      1|		_("Combine convolution results like this"),
  179|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  180|      1|		G_STRUCT_OFFSET(VipsCompass, combine),
  181|      1|		VIPS_TYPE_COMBINE, VIPS_COMBINE_MAX);
  182|       |
  183|      1|	VIPS_ARG_ENUM(class, "precision", 203,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  184|      1|		_("Precision"),
  185|      1|		_("Convolve with this precision"),
  186|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  187|      1|		G_STRUCT_OFFSET(VipsCompass, precision),
  188|      1|		VIPS_TYPE_PRECISION, VIPS_PRECISION_FLOAT);
  189|       |
  190|      1|	VIPS_ARG_INT(class, "layers", 204,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  191|      1|		_("Layers"),
  192|      1|		_("Use this many layers in approximation"),
  193|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  194|      1|		G_STRUCT_OFFSET(VipsCompass, layers),
  195|      1|		1, 1000, 5);
  196|       |
  197|      1|	VIPS_ARG_INT(class, "cluster", 205,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  198|      1|		_("Cluster"),
  199|      1|		_("Cluster lines closer than this in approximation"),
  200|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  201|      1|		G_STRUCT_OFFSET(VipsCompass, cluster),
  202|      1|		1, 100, 1);
  203|      1|}

conv.c:vips_conv_class_init:
  122|      1|{
  123|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  124|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  125|       |
  126|      1|	gobject_class->set_property = vips_object_set_property;
  127|      1|	gobject_class->get_property = vips_object_get_property;
  128|       |
  129|      1|	object_class->nickname = "conv";
  130|      1|	object_class->description = _("convolution operation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  131|      1|	object_class->build = vips_conv_build;
  132|       |
  133|      1|	VIPS_ARG_ENUM(class, "precision", 103,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  134|      1|		_("Precision"),
  135|      1|		_("Convolve with this precision"),
  136|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  137|      1|		G_STRUCT_OFFSET(VipsConv, precision),
  138|      1|		VIPS_TYPE_PRECISION, VIPS_PRECISION_FLOAT);
  139|       |
  140|      1|	VIPS_ARG_INT(class, "layers", 104,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  141|      1|		_("Layers"),
  142|      1|		_("Use this many layers in approximation"),
  143|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  144|      1|		G_STRUCT_OFFSET(VipsConv, layers),
  145|      1|		1, 1000, 5);
  146|       |
  147|      1|	VIPS_ARG_INT(class, "cluster", 105,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  148|      1|		_("Cluster"),
  149|      1|		_("Cluster lines closer than this in approximation"),
  150|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  151|      1|		G_STRUCT_OFFSET(VipsConv, cluster),
  152|      1|		1, 100, 1);
  153|      1|}

conva.c:vips_conva_class_init:
 1311|      1|{
 1312|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1313|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1314|       |
 1315|      1|	gobject_class->set_property = vips_object_set_property;
 1316|      1|	gobject_class->get_property = vips_object_get_property;
 1317|       |
 1318|      1|	object_class->nickname = "conva";
 1319|      1|	object_class->description = _("approximate integer convolution");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1320|      1|	object_class->build = vips_conva_build;
 1321|       |
 1322|      1|	VIPS_ARG_INT(class, "layers", 104,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1323|      1|		_("Layers"),
 1324|      1|		_("Use this many layers in approximation"),
 1325|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1326|      1|		G_STRUCT_OFFSET(VipsConva, layers),
 1327|      1|		1, 1000, 5);
 1328|       |
 1329|      1|	VIPS_ARG_INT(class, "cluster", 105,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1330|      1|		_("Cluster"),
 1331|      1|		_("Cluster lines closer than this in approximation"),
 1332|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1333|      1|		G_STRUCT_OFFSET(VipsConva, cluster),
 1334|      1|		1, 100, 1);
 1335|      1|}

convasep.c:vips_convasep_class_init:
  905|      1|{
  906|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  907|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  908|       |
  909|      1|	gobject_class->set_property = vips_object_set_property;
  910|      1|	gobject_class->get_property = vips_object_get_property;
  911|       |
  912|      1|	object_class->nickname = "convasep";
  913|      1|	object_class->description =
  914|      1|		_("approximate separable integer convolution");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  915|      1|	object_class->build = vips_convasep_build;
  916|       |
  917|      1|	VIPS_ARG_INT(class, "layers", 104,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  918|      1|		_("Layers"),
  919|      1|		_("Use this many layers in approximation"),
  920|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  921|      1|		G_STRUCT_OFFSET(VipsConvasep, layers),
  922|      1|		1, 1000, 5);
  923|      1|}

convf.c:vips_convf_class_init:
  370|      1|{
  371|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  372|       |
  373|      1|	object_class->nickname = "convf";
  374|      1|	object_class->description = _("float convolution operation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  375|      1|	object_class->build = vips_convf_build;
  376|      1|}

convi.c:vips_convi_class_init:
 1234|      1|{
 1235|       |#ifdef HAVE_ORC
 1236|       |	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
 1237|       |#endif /*HAVE_ORC*/
 1238|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1239|       |
 1240|       |#ifdef HAVE_ORC
 1241|       |	gobject_class->finalize = vips_convi_finalize;
 1242|       |#endif /*HAVE_ORC*/
 1243|       |
 1244|      1|	object_class->nickname = "convi";
 1245|      1|	object_class->description = _("int convolution operation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1246|      1|	object_class->build = vips_convi_build;
 1247|      1|}

vips_convolution_operation_init:
  156|      2|{
  157|      2|	extern GType vips_conv_get_type(void);
  158|      2|	extern GType vips_conva_get_type(void);
  159|      2|	extern GType vips_convf_get_type(void);
  160|      2|	extern GType vips_convi_get_type(void);
  161|      2|	extern GType vips_convsep_get_type(void);
  162|      2|	extern GType vips_convasep_get_type(void);
  163|      2|	extern GType vips_compass_get_type(void);
  164|      2|	extern GType vips_fastcor_get_type(void);
  165|      2|	extern GType vips_spcor_get_type(void);
  166|      2|	extern GType vips_sharpen_get_type(void);
  167|      2|	extern GType vips_gaussblur_get_type(void);
  168|      2|	extern GType vips_sobel_get_type(void);
  169|      2|	extern GType vips_scharr_get_type(void);
  170|      2|	extern GType vips_prewitt_get_type(void);
  171|      2|	extern GType vips_canny_get_type(void);
  172|       |
  173|      2|	vips_conv_get_type();
  174|      2|	vips_conva_get_type();
  175|      2|	vips_convf_get_type();
  176|      2|	vips_convi_get_type();
  177|      2|	vips_compass_get_type();
  178|      2|	vips_convsep_get_type();
  179|      2|	vips_convasep_get_type();
  180|      2|	vips_fastcor_get_type();
  181|      2|	vips_spcor_get_type();
  182|      2|	vips_sharpen_get_type();
  183|      2|	vips_gaussblur_get_type();
  184|      2|	vips_sobel_get_type();
  185|      2|	vips_scharr_get_type();
  186|      2|	vips_prewitt_get_type();
  187|      2|	vips_canny_get_type();
  188|      2|}
convolution.c:vips_convolution_class_init:
  110|      1|{
  111|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  112|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  113|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  114|       |
  115|      1|	gobject_class->set_property = vips_object_set_property;
  116|      1|	gobject_class->get_property = vips_object_get_property;
  117|       |
  118|      1|	vobject_class->nickname = "convolution";
  119|      1|	vobject_class->description = _("convolution operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  120|      1|	vobject_class->build = vips_convolution_build;
  121|       |
  122|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  123|       |
  124|       |	/* Inputs set by subclassess.
  125|       |	 */
  126|       |
  127|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  128|      1|		_("Input"),
  129|      1|		_("Input image argument"),
  130|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  131|      1|		G_STRUCT_OFFSET(VipsConvolution, in));
  132|       |
  133|      1|	VIPS_ARG_IMAGE(class, "out", 10,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  134|      1|		_("Output"),
  135|      1|		_("Output image"),
  136|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  137|      1|		G_STRUCT_OFFSET(VipsConvolution, out));
  138|       |
  139|      1|	VIPS_ARG_IMAGE(class, "mask", 20,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  140|      1|		_("Mask"),
  141|      1|		_("Input matrix image"),
  142|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  143|      1|		G_STRUCT_OFFSET(VipsConvolution, mask));
  144|      1|}

convsep.c:vips_convsep_class_init:
  118|      1|{
  119|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  120|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  121|       |
  122|      1|	gobject_class->set_property = vips_object_set_property;
  123|      1|	gobject_class->get_property = vips_object_get_property;
  124|       |
  125|      1|	object_class->nickname = "convsep";
  126|      1|	object_class->description = _("separable convolution operation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  127|      1|	object_class->build = vips_convsep_build;
  128|       |
  129|      1|	VIPS_ARG_ENUM(class, "precision", 203,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  130|      1|		_("Precision"),
  131|      1|		_("Convolve with this precision"),
  132|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  133|      1|		G_STRUCT_OFFSET(VipsConvsep, precision),
  134|      1|		VIPS_TYPE_PRECISION, VIPS_PRECISION_FLOAT);
  135|       |
  136|      1|	VIPS_ARG_INT(class, "layers", 204,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  137|      1|		_("Layers"),
  138|      1|		_("Use this many layers in approximation"),
  139|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  140|      1|		G_STRUCT_OFFSET(VipsConvsep, layers),
  141|      1|		1, 1000, 5);
  142|       |
  143|      1|	VIPS_ARG_INT(class, "cluster", 205,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  144|      1|		_("Cluster"),
  145|      1|		_("Cluster lines closer than this in approximation"),
  146|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  147|      1|		G_STRUCT_OFFSET(VipsConvsep, cluster),
  148|      1|		1, 100, 1);
  149|      1|}

correlation.c:vips_correlation_class_init:
  135|      1|{
  136|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  137|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  138|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  139|       |
  140|      1|	gobject_class->set_property = vips_object_set_property;
  141|      1|	gobject_class->get_property = vips_object_get_property;
  142|       |
  143|      1|	object_class->nickname = "correlation";
  144|      1|	object_class->description = _("correlation operation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  145|      1|	object_class->build = vips_correlation_build;
  146|       |
  147|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  148|       |
  149|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  150|      1|		_("Input"),
  151|      1|		_("Input image argument"),
  152|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  153|      1|		G_STRUCT_OFFSET(VipsCorrelation, in));
  154|       |
  155|      1|	VIPS_ARG_IMAGE(class, "ref", 10,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  156|      1|		_("Mask"),
  157|      1|		_("Input reference image"),
  158|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  159|      1|		G_STRUCT_OFFSET(VipsCorrelation, ref));
  160|       |
  161|      1|	VIPS_ARG_IMAGE(class, "out", 20,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  162|      1|		_("Output"),
  163|      1|		_("Output image"),
  164|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  165|      1|		G_STRUCT_OFFSET(VipsCorrelation, out));
  166|      1|}

edge.c:vips_edge_class_init:
  204|      1|{
  205|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  206|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  207|       |
  208|      1|	gobject_class->dispose = vips_edge_dispose;
  209|      1|	gobject_class->set_property = vips_object_set_property;
  210|      1|	gobject_class->get_property = vips_object_get_property;
  211|       |
  212|      1|	object_class->nickname = "edge";
  213|      1|	object_class->description = _("Edge detector");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  214|      1|	object_class->build = vips_edge_build;
  215|       |
  216|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  217|      1|		_("Input"),
  218|      1|		_("Input image"),
  219|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  220|      1|		G_STRUCT_OFFSET(VipsEdge, in));
  221|       |
  222|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  223|      1|		_("Output"),
  224|      1|		_("Output image"),
  225|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  226|      1|		G_STRUCT_OFFSET(VipsEdge, out));
  227|      1|}
edge.c:vips_sobel_class_init:
  254|      1|{
  255|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  256|       |
  257|      1|	object_class->nickname = "sobel";
  258|      1|	object_class->description = _("Sobel edge detector");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  259|      1|	object_class->build = vips_sobel_build;
  260|      1|}
edge.c:vips_scharr_class_init:
  287|      1|{
  288|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  289|       |
  290|      1|	object_class->nickname = "scharr";
  291|      1|	object_class->description = _("Scharr edge detector");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  292|      1|	object_class->build = vips_scharr_build;
  293|      1|}
edge.c:vips_prewitt_class_init:
  320|      1|{
  321|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  322|       |
  323|      1|	object_class->nickname = "prewitt";
  324|      1|	object_class->description = _("Prewitt edge detector");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  325|      1|	object_class->build = vips_prewitt_build;
  326|      1|}

fastcor.c:vips_fastcor_class_init:
  213|      1|{
  214|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  215|      1|	VipsCorrelationClass *cclass = VIPS_CORRELATION_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_CORRELATION, VipsCorrelationClass))
  ------------------
  216|       |
  217|      1|	object_class->nickname = "fastcor";
  218|      1|	object_class->description = _("fast correlation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  219|       |
  220|      1|	cclass->format_table = vips_fastcor_format_table;
  221|      1|	cclass->correlation = vips_fastcor_correlation;
  222|      1|}

gaussblur.c:vips_gaussblur_class_init:
  117|      1|{
  118|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  119|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  120|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  121|       |
  122|      1|	gobject_class->set_property = vips_object_set_property;
  123|      1|	gobject_class->get_property = vips_object_get_property;
  124|       |
  125|      1|	object_class->nickname = "gaussblur";
  126|      1|	object_class->description = _("gaussian blur");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  127|      1|	object_class->build = vips_gaussblur_build;
  128|       |
  129|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  130|       |
  131|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  132|      1|		_("Input"),
  133|      1|		_("Input image"),
  134|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  135|      1|		G_STRUCT_OFFSET(VipsGaussblur, in));
  136|       |
  137|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  138|      1|		_("Output"),
  139|      1|		_("Output image"),
  140|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  141|      1|		G_STRUCT_OFFSET(VipsGaussblur, out));
  142|       |
  143|      1|	VIPS_ARG_DOUBLE(class, "sigma", 3,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  144|      1|		_("Sigma"),
  145|      1|		_("Sigma of Gaussian"),
  146|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  147|      1|		G_STRUCT_OFFSET(VipsGaussblur, sigma),
  148|      1|		0.0, 1000, 1.5);
  149|       |
  150|      1|	VIPS_ARG_DOUBLE(class, "min_ampl", 3,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  151|      1|		_("Minimum amplitude"),
  152|      1|		_("Minimum amplitude of Gaussian"),
  153|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  154|      1|		G_STRUCT_OFFSET(VipsGaussblur, min_ampl),
  155|      1|		0.001, 1.0, 0.2);
  156|       |
  157|      1|	VIPS_ARG_ENUM(class, "precision", 4,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  158|      1|		_("Precision"),
  159|      1|		_("Convolve with this precision"),
  160|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  161|      1|		G_STRUCT_OFFSET(VipsGaussblur, precision),
  162|      1|		VIPS_TYPE_PRECISION, VIPS_PRECISION_INTEGER);
  163|      1|}

sharpen.c:vips_sharpen_class_init:
  307|      1|{
  308|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  309|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  310|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  311|       |
  312|      1|	gobject_class->set_property = vips_object_set_property;
  313|      1|	gobject_class->get_property = vips_object_get_property;
  314|       |
  315|      1|	object_class->nickname = "sharpen";
  316|      1|	object_class->description = _("unsharp masking for print");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  317|      1|	object_class->build = vips_sharpen_build;
  318|       |
  319|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  320|       |
  321|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  322|      1|		_("Input"),
  323|      1|		_("Input image"),
  324|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  325|      1|		G_STRUCT_OFFSET(VipsSharpen, in));
  326|       |
  327|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  328|      1|		_("Output"),
  329|      1|		_("Output image"),
  330|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  331|      1|		G_STRUCT_OFFSET(VipsSharpen, out));
  332|       |
  333|      1|	VIPS_ARG_DOUBLE(class, "sigma", 3,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  334|      1|		_("Sigma"),
  335|      1|		_("Sigma of Gaussian"),
  336|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  337|      1|		G_STRUCT_OFFSET(VipsSharpen, sigma),
  338|      1|		0.000001, 10.0, 0.5);
  339|       |
  340|      1|	VIPS_ARG_DOUBLE(class, "x1", 5,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  341|      1|		_("x1"),
  342|      1|		_("Flat/jaggy threshold"),
  343|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  344|      1|		G_STRUCT_OFFSET(VipsSharpen, x1),
  345|      1|		0, 1000000, 2.0);
  346|       |
  347|      1|	VIPS_ARG_DOUBLE(class, "y2", 6,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  348|      1|		_("y2"),
  349|      1|		_("Maximum brightening"),
  350|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  351|      1|		G_STRUCT_OFFSET(VipsSharpen, y2),
  352|      1|		0, 1000000, 10);
  353|       |
  354|      1|	VIPS_ARG_DOUBLE(class, "y3", 7,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  355|      1|		_("y3"),
  356|      1|		_("Maximum darkening"),
  357|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  358|      1|		G_STRUCT_OFFSET(VipsSharpen, y3),
  359|      1|		0, 1000000, 20);
  360|       |
  361|      1|	VIPS_ARG_DOUBLE(class, "m1", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  362|      1|		_("m1"),
  363|      1|		_("Slope for flat areas"),
  364|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  365|      1|		G_STRUCT_OFFSET(VipsSharpen, m1),
  366|      1|		0, 1000000, 0.0);
  367|       |
  368|      1|	VIPS_ARG_DOUBLE(class, "m2", 9,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  369|      1|		_("m2"),
  370|      1|		_("Slope for jaggy areas"),
  371|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  372|      1|		G_STRUCT_OFFSET(VipsSharpen, m2),
  373|      1|		0, 1000000, 3.0);
  374|       |
  375|       |	/* We used to have a radius control.
  376|       |	 */
  377|      1|	VIPS_ARG_INT(class, "radius", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  378|      1|		_("Radius"),
  379|      1|		_("Radius of Gaussian"),
  380|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  381|      1|		G_STRUCT_OFFSET(VipsSharpen, radius),
  382|      1|		1, 100, 1);
  383|      1|}

spcor.c:vips_spcor_class_init:
  312|      1|{
  313|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  314|      1|	VipsCorrelationClass *cclass = VIPS_CORRELATION_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_CORRELATION, VipsCorrelationClass))
  ------------------
  315|       |
  316|      1|	object_class->nickname = "spcor";
  317|      1|	object_class->description = _("spatial correlation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  318|       |
  319|      1|	cclass->format_table = vips_spcor_format_table;
  320|      1|	cclass->pre_generate = vips_spcor_pre_generate;
  321|      1|	cclass->correlation = vips_spcor_correlation;
  322|      1|}

vips_black:
  186|  8.75k|{
  187|  8.75k|	va_list ap;
  188|  8.75k|	int result;
  189|       |
  190|  8.75k|	va_start(ap, height);
  191|  8.75k|	result = vips_call_split("black", ap, out, width, height);
  192|  8.75k|	va_end(ap);
  193|       |
  194|  8.75k|	return result;
  195|  8.75k|}
black.c:vips_black_class_init:
  126|      1|{
  127|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  128|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  129|       |
  130|      1|	VIPS_DEBUG_MSG("vips_black_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  131|       |
  132|      1|	gobject_class->set_property = vips_object_set_property;
  133|      1|	gobject_class->get_property = vips_object_get_property;
  134|       |
  135|      1|	vobject_class->nickname = "black";
  136|      1|	vobject_class->description = _("make a black image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  137|      1|	vobject_class->build = vips_black_build;
  138|       |
  139|      1|	VIPS_ARG_INT(class, "width", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  140|      1|		_("Width"),
  141|      1|		_("Image width in pixels"),
  142|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  143|      1|		G_STRUCT_OFFSET(VipsBlack, width),
  144|      1|		1, VIPS_MAX_COORD, 1);
  145|       |
  146|      1|	VIPS_ARG_INT(class, "height", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  147|      1|		_("Height"),
  148|      1|		_("Image height in pixels"),
  149|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  150|      1|		G_STRUCT_OFFSET(VipsBlack, height),
  151|      1|		1, VIPS_MAX_COORD, 1);
  152|       |
  153|      1|	VIPS_ARG_INT(class, "bands", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  154|      1|		_("Bands"),
  155|      1|		_("Number of bands in image"),
  156|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  157|      1|		G_STRUCT_OFFSET(VipsBlack, bands),
  158|      1|		1, VIPS_MAX_COORD, 1);
  159|      1|}
black.c:vips_black_build:
  101|     63|{
  102|     63|	VipsCreate *create = VIPS_CREATE(object);
  ------------------
  |  |   40|     63|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     63|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     63|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|     63|		VIPS_TYPE_CREATE, VipsCreate))
  ------------------
  103|     63|	VipsBlack *black = (VipsBlack *) object;
  104|       |
  105|     63|	if (VIPS_OBJECT_CLASS(vips_black_parent_class)->build(object))
  ------------------
  |  |  435|     63|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|     63|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|     63|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (105:6): [True: 0, False: 63]
  ------------------
  106|      0|		return -1;
  107|       |
  108|     63|	vips_image_init_fields(create->out,
  109|     63|		black->width, black->height, black->bands,
  110|     63|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  111|     63|		VIPS_INTERPRETATION_MULTIBAND,
  112|     63|		1.0, 1.0);
  113|     63|	if (vips_image_pipelinev(create->out,
  ------------------
  |  Branch (113:6): [True: 0, False: 63]
  ------------------
  114|     63|			VIPS_DEMAND_STYLE_ANY, NULL))
  115|      0|		return -1;
  116|       |
  117|     63|	if (vips_image_generate(create->out,
  ------------------
  |  Branch (117:6): [True: 0, False: 63]
  ------------------
  118|     63|			NULL, vips_black_gen, NULL, NULL, NULL))
  119|      0|		return -1;
  120|       |
  121|     63|	return 0;
  122|     63|}
black.c:vips_black_gen:
   85|  8.75k|{
   86|       |	/*
   87|       |	VipsRect *r = &out_region->valid;
   88|       |
   89|       |	printf("vips_black_gen: "
   90|       |		   "left = %d, top = %d, width = %d, height = %d\n",
   91|       |		r->left, r->top, r->width, r->height);
   92|       |	 */
   93|       |
   94|  8.75k|	vips_region_black(out_region);
   95|       |
   96|  8.75k|	return 0;
   97|  8.75k|}
black.c:vips_black_init:
  163|  8.75k|{
  164|  8.75k|	black->bands = 1;
  165|  8.75k|}

buildlut.c:vips_buildlut_class_init:
  250|      1|{
  251|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  252|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  253|       |
  254|      1|	gobject_class->dispose = vips_buildlut_dispose;
  255|      1|	gobject_class->set_property = vips_object_set_property;
  256|      1|	gobject_class->get_property = vips_object_get_property;
  257|       |
  258|      1|	vobject_class->nickname = "buildlut";
  259|      1|	vobject_class->description = _("build a look-up table");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  260|      1|	vobject_class->build = vips_buildlut_build;
  261|       |
  262|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  263|      1|		_("Input"),
  264|      1|		_("Matrix of XY coordinates"),
  265|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  266|      1|		G_STRUCT_OFFSET(VipsBuildlut, in));
  267|      1|}

vips_create_operation_init:
  137|      2|{
  138|      2|	extern GType vips_black_get_type(void);
  139|      2|	extern GType vips_gaussmat_get_type(void);
  140|      2|	extern GType vips_logmat_get_type(void);
  141|      2|	extern GType vips_gaussnoise_get_type(void);
  142|       |#ifdef HAVE_PANGOCAIRO
  143|       |	extern GType vips_text_get_type(void);
  144|       |#endif /*HAVE_PANGOCAIRO*/
  145|      2|	extern GType vips_xyz_get_type(void);
  146|      2|	extern GType vips_sdf_get_type(void);
  147|      2|	extern GType vips_eye_get_type(void);
  148|      2|	extern GType vips_grey_get_type(void);
  149|      2|	extern GType vips_zone_get_type(void);
  150|      2|	extern GType vips_sines_get_type(void);
  151|      2|	extern GType vips_buildlut_get_type(void);
  152|      2|	extern GType vips_invertlut_get_type(void);
  153|      2|	extern GType vips_tonelut_get_type(void);
  154|      2|	extern GType vips_identity_get_type(void);
  155|      2|	extern GType vips_mask_butterworth_get_type(void);
  156|      2|	extern GType vips_mask_butterworth_ring_get_type(void);
  157|      2|	extern GType vips_mask_butterworth_band_get_type(void);
  158|      2|	extern GType vips_mask_gaussian_get_type(void);
  159|      2|	extern GType vips_mask_gaussian_ring_get_type(void);
  160|      2|	extern GType vips_mask_gaussian_band_get_type(void);
  161|      2|	extern GType vips_mask_ideal_get_type(void);
  162|      2|	extern GType vips_mask_ideal_ring_get_type(void);
  163|      2|	extern GType vips_mask_ideal_band_get_type(void);
  164|      2|	extern GType vips_mask_fractal_get_type(void);
  165|      2|	extern GType vips_fractsurf_get_type(void);
  166|      2|	extern GType vips_worley_get_type(void);
  167|      2|	extern GType vips_perlin_get_type(void);
  168|       |
  169|      2|	vips_black_get_type();
  170|      2|	vips_gaussmat_get_type();
  171|      2|	vips_logmat_get_type();
  172|      2|	vips_gaussnoise_get_type();
  173|       |#ifdef HAVE_PANGOCAIRO
  174|       |	vips_text_get_type();
  175|       |#endif /*HAVE_PANGOCAIRO*/
  176|      2|	vips_xyz_get_type();
  177|      2|	vips_sdf_get_type();
  178|      2|	vips_eye_get_type();
  179|      2|	vips_grey_get_type();
  180|      2|	vips_zone_get_type();
  181|      2|	vips_sines_get_type();
  182|      2|	vips_buildlut_get_type();
  183|      2|	vips_invertlut_get_type();
  184|      2|	vips_tonelut_get_type();
  185|      2|	vips_identity_get_type();
  186|      2|	vips_mask_ideal_get_type();
  187|      2|	vips_mask_ideal_ring_get_type();
  188|      2|	vips_mask_ideal_band_get_type();
  189|      2|	vips_mask_butterworth_get_type();
  190|      2|	vips_mask_butterworth_ring_get_type();
  191|      2|	vips_mask_butterworth_band_get_type();
  192|      2|	vips_mask_gaussian_get_type();
  193|      2|	vips_mask_gaussian_ring_get_type();
  194|      2|	vips_mask_gaussian_band_get_type();
  195|      2|	vips_mask_fractal_get_type();
  196|      2|	vips_fractsurf_get_type();
  197|      2|	vips_worley_get_type();
  198|      2|	vips_perlin_get_type();
  199|      2|}
create.c:vips_create_class_init:
  112|      1|{
  113|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  114|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  115|       |
  116|      1|	gobject_class->set_property = vips_object_set_property;
  117|      1|	gobject_class->get_property = vips_object_get_property;
  118|       |
  119|      1|	vobject_class->nickname = "create";
  120|      1|	vobject_class->description = _("create operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  121|      1|	vobject_class->build = vips_create_build;
  122|       |
  123|      1|	VIPS_ARG_IMAGE(class, "out", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  124|      1|		_("Output"),
  125|      1|		_("Output image"),
  126|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  127|      1|		G_STRUCT_OFFSET(VipsCreate, out));
  128|      1|}
create.c:vips_create_build:
   93|     63|{
   94|     63|	VipsCreate *create = VIPS_CREATE(object);
  ------------------
  |  |   40|     63|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     63|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     63|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|     63|		VIPS_TYPE_CREATE, VipsCreate))
  ------------------
   95|       |
   96|       |#ifdef DEBUG
   97|       |	printf("vips_create_build: ");
   98|       |	vips_object_print_name(object);
   99|       |	printf("\n");
  100|       |#endif /*DEBUG*/
  101|       |
  102|     63|	g_object_set(create, "out", vips_image_new(), NULL);
  103|       |
  104|     63|	if (VIPS_OBJECT_CLASS(vips_create_parent_class)->build(object))
  ------------------
  |  |  435|     63|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|     63|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|     63|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (104:6): [True: 0, False: 63]
  ------------------
  105|      0|		return -1;
  106|       |
  107|     63|	return 0;
  108|     63|}
create.c:vips_create_init:
  132|  8.75k|{
  133|  8.75k|}

eye.c:vips_eye_class_init:
   93|      1|{
   94|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   95|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   96|      1|	VipsPointClass *point_class = VIPS_POINT_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_POINT, VipsPointClass))
  ------------------
   97|       |
   98|      1|	gobject_class->set_property = vips_object_set_property;
   99|      1|	gobject_class->get_property = vips_object_get_property;
  100|       |
  101|      1|	vobject_class->nickname = "eye";
  102|      1|	vobject_class->description =
  103|      1|		_("make an image showing the eye's spatial response");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  104|       |
  105|      1|	point_class->point = vips_eye_point;
  106|       |
  107|      1|	VIPS_ARG_DOUBLE(class, "factor", 6,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  108|      1|		_("Factor"),
  109|      1|		_("Maximum spatial frequency"),
  110|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  111|      1|		G_STRUCT_OFFSET(VipsEye, factor),
  112|      1|		0.0, 1.0, 0.5);
  113|      1|}

fractsurf.c:vips_fractsurf_class_init:
   92|      1|{
   93|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   94|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   95|       |
   96|      1|	gobject_class->set_property = vips_object_set_property;
   97|      1|	gobject_class->get_property = vips_object_get_property;
   98|       |
   99|      1|	vobject_class->nickname = "fractsurf";
  100|      1|	vobject_class->description = _("make a fractal surface");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  101|      1|	vobject_class->build = vips_fractsurf_build;
  102|       |
  103|      1|	VIPS_ARG_INT(class, "width", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  104|      1|		_("Width"),
  105|      1|		_("Image width in pixels"),
  106|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  107|      1|		G_STRUCT_OFFSET(VipsFractsurf, width),
  108|      1|		1, VIPS_MAX_COORD, 64);
  109|       |
  110|      1|	VIPS_ARG_INT(class, "height", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  111|      1|		_("Height"),
  112|      1|		_("Image height in pixels"),
  113|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  114|      1|		G_STRUCT_OFFSET(VipsFractsurf, height),
  115|      1|		1, VIPS_MAX_COORD, 64);
  116|       |
  117|      1|	VIPS_ARG_DOUBLE(class, "fractal_dimension", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  118|      1|		_("Fractal dimension"),
  119|      1|		_("Fractal dimension"),
  120|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  121|      1|		G_STRUCT_OFFSET(VipsFractsurf, fractal_dimension),
  122|      1|		2.0, 3.0, 2.5);
  123|      1|}

gaussmat.c:vips_gaussmat_class_init:
  173|      1|{
  174|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  175|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  176|       |
  177|      1|	gobject_class->set_property = vips_object_set_property;
  178|      1|	gobject_class->get_property = vips_object_get_property;
  179|       |
  180|      1|	vobject_class->nickname = "gaussmat";
  181|      1|	vobject_class->description = _("make a gaussian image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  182|      1|	vobject_class->build = vips_gaussmat_build;
  183|       |
  184|      1|	VIPS_ARG_DOUBLE(class, "sigma", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  185|      1|		_("Sigma"),
  186|      1|		_("Sigma of Gaussian"),
  187|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  188|      1|		G_STRUCT_OFFSET(VipsGaussmat, sigma),
  189|      1|		0.000001, 10000.0, 1.0);
  190|       |
  191|      1|	VIPS_ARG_DOUBLE(class, "min_ampl", 3,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  192|      1|		_("Minimum amplitude"),
  193|      1|		_("Minimum amplitude of Gaussian"),
  194|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  195|      1|		G_STRUCT_OFFSET(VipsGaussmat, min_ampl),
  196|      1|		0.000001, 10000.0, 0.1);
  197|       |
  198|      1|	VIPS_ARG_BOOL(class, "separable", 4,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  199|      1|		_("Separable"),
  200|      1|		_("Generate separable Gaussian"),
  201|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  202|      1|		G_STRUCT_OFFSET(VipsGaussmat, separable),
  203|      1|		FALSE);
  204|       |
  205|      1|	VIPS_ARG_BOOL(class, "integer", 5,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  206|      1|		_("Integer"),
  207|      1|		_("Generate integer Gaussian"),
  208|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  209|      1|		G_STRUCT_OFFSET(VipsGaussmat, integer),
  210|      1|		FALSE);
  211|       |
  212|      1|	VIPS_ARG_ENUM(class, "precision", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  213|      1|		_("Precision"),
  214|      1|		_("Generate with this precision"),
  215|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  216|      1|		G_STRUCT_OFFSET(VipsGaussmat, precision),
  217|      1|		VIPS_TYPE_PRECISION, VIPS_PRECISION_INTEGER);
  218|      1|}

gaussnoise.c:vips_gaussnoise_class_init:
  150|      1|{
  151|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  152|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  153|      1|	VipsOperationClass *operation_class = (VipsOperationClass *) class;
  154|       |
  155|      1|	gobject_class->set_property = vips_object_set_property;
  156|      1|	gobject_class->get_property = vips_object_get_property;
  157|       |
  158|      1|	vobject_class->nickname = "gaussnoise";
  159|      1|	vobject_class->description = _("make a gaussnoise image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  160|      1|	vobject_class->build = vips_gaussnoise_build;
  161|       |
  162|       |	/* We want a new set of numbers each time.
  163|       |	 */
  164|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  165|       |
  166|      1|	VIPS_ARG_INT(class, "width", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  167|      1|		_("Width"),
  168|      1|		_("Image width in pixels"),
  169|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  170|      1|		G_STRUCT_OFFSET(VipsGaussnoise, width),
  171|      1|		1, VIPS_MAX_COORD, 1);
  172|       |
  173|      1|	VIPS_ARG_INT(class, "height", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  174|      1|		_("Height"),
  175|      1|		_("Image height in pixels"),
  176|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  177|      1|		G_STRUCT_OFFSET(VipsGaussnoise, height),
  178|      1|		1, VIPS_MAX_COORD, 1);
  179|       |
  180|      1|	VIPS_ARG_DOUBLE(class, "mean", 6,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  181|      1|		_("Mean"),
  182|      1|		_("Mean of pixels in generated image"),
  183|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  184|      1|		G_STRUCT_OFFSET(VipsGaussnoise, mean),
  185|      1|		-10000000, 1000000, 128);
  186|       |
  187|      1|	VIPS_ARG_DOUBLE(class, "sigma", 6,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  188|      1|		_("Sigma"),
  189|      1|		_("Standard deviation of pixels in generated image"),
  190|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  191|      1|		G_STRUCT_OFFSET(VipsGaussnoise, sigma),
  192|      1|		0, 100000, 30);
  193|       |
  194|      1|	VIPS_ARG_INT(class, "seed", 7,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  195|      1|		_("Seed"),
  196|      1|		_("Random number seed"),
  197|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  198|      1|		G_STRUCT_OFFSET(VipsGaussnoise, seed),
  199|      1|		INT_MIN, INT_MAX, 0);
  200|      1|}

grey.c:vips_grey_class_init:
   84|      1|{
   85|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   86|      1|	VipsPointClass *point_class = VIPS_POINT_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_POINT, VipsPointClass))
  ------------------
   87|       |
   88|      1|	vobject_class->nickname = "grey";
   89|      1|	vobject_class->description = _("make a grey ramp image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   90|       |
   91|      1|	point_class->point = vips_grey_point;
   92|      1|	point_class->min = 0.0;
   93|      1|	point_class->max = 1.0;
   94|      1|}

identity.c:vips_identity_class_init:
  130|      1|{
  131|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  133|       |
  134|      1|	gobject_class->set_property = vips_object_set_property;
  135|      1|	gobject_class->get_property = vips_object_get_property;
  136|       |
  137|      1|	vobject_class->nickname = "identity";
  138|      1|	vobject_class->description =
  139|      1|		_("make a 1D image where pixel values are indexes");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  140|      1|	vobject_class->build = vips_identity_build;
  141|       |
  142|      1|	VIPS_ARG_INT(class, "bands", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  143|      1|		_("Bands"),
  144|      1|		_("Number of bands in LUT"),
  145|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  146|      1|		G_STRUCT_OFFSET(VipsIdentity, bands),
  147|      1|		1, 100000, 1);
  148|       |
  149|      1|	VIPS_ARG_BOOL(class, "ushort", 4,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  150|      1|		_("Ushort"),
  151|      1|		_("Create a 16-bit LUT"),
  152|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  153|      1|		G_STRUCT_OFFSET(VipsIdentity, ushort),
  154|      1|		FALSE);
  155|       |
  156|      1|	VIPS_ARG_INT(class, "size", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  157|      1|		_("Size"),
  158|      1|		_("Size of 16-bit LUT"),
  159|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  160|      1|		G_STRUCT_OFFSET(VipsIdentity, size),
  161|      1|		1, 65536, 65536);
  162|      1|}

invertlut.c:vips_invertlut_class_init:
  275|      1|{
  276|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  277|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  278|       |
  279|      1|	gobject_class->dispose = vips_invertlut_dispose;
  280|      1|	gobject_class->set_property = vips_object_set_property;
  281|      1|	gobject_class->get_property = vips_object_get_property;
  282|       |
  283|      1|	vobject_class->nickname = "invertlut";
  284|      1|	vobject_class->description = _("build an inverted look-up table");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  285|      1|	vobject_class->build = vips_invertlut_build;
  286|       |
  287|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  288|      1|		_("Input"),
  289|      1|		_("Matrix of XY coordinates"),
  290|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  291|      1|		G_STRUCT_OFFSET(VipsInvertlut, in));
  292|       |
  293|      1|	VIPS_ARG_INT(class, "size", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  294|      1|		_("Size"),
  295|      1|		_("LUT size to generate"),
  296|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  297|      1|		G_STRUCT_OFFSET(VipsInvertlut, size),
  298|      1|		1, 1000000, 256);
  299|      1|}

logmat.c:vips_logmat_class_init:
  189|      1|{
  190|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  191|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|       |
  193|      1|	gobject_class->set_property = vips_object_set_property;
  194|      1|	gobject_class->get_property = vips_object_get_property;
  195|       |
  196|      1|	vobject_class->nickname = "logmat";
  197|      1|	vobject_class->description = _("make a Laplacian of Gaussian image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  198|      1|	vobject_class->build = vips_logmat_build;
  199|       |
  200|      1|	VIPS_ARG_DOUBLE(class, "sigma", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  201|      1|		_("Radius"),
  202|      1|		_("Radius of Gaussian"),
  203|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  204|      1|		G_STRUCT_OFFSET(VipsLogmat, sigma),
  205|      1|		0.000001, 10000.0, 1.0);
  206|       |
  207|      1|	VIPS_ARG_DOUBLE(class, "min_ampl", 3,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  208|      1|		_("Width"),
  209|      1|		_("Minimum amplitude of Gaussian"),
  210|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  211|      1|		G_STRUCT_OFFSET(VipsLogmat, min_ampl),
  212|      1|		0.000001, 10000.0, 0.1);
  213|       |
  214|      1|	VIPS_ARG_BOOL(class, "separable", 4,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  215|      1|		_("Separable"),
  216|      1|		_("Generate separable Gaussian"),
  217|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  218|      1|		G_STRUCT_OFFSET(VipsLogmat, separable),
  219|      1|		FALSE);
  220|       |
  221|      1|	VIPS_ARG_BOOL(class, "integer", 5,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  222|      1|		_("Integer"),
  223|      1|		_("Generate integer Gaussian"),
  224|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  225|      1|		G_STRUCT_OFFSET(VipsLogmat, integer),
  226|      1|		FALSE);
  227|       |
  228|      1|	VIPS_ARG_ENUM(class, "precision", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  229|      1|		_("Precision"),
  230|      1|		_("Generate with this precision"),
  231|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  232|      1|		G_STRUCT_OFFSET(VipsLogmat, precision),
  233|      1|		VIPS_TYPE_PRECISION, VIPS_PRECISION_INTEGER);
  234|      1|}

mask.c:vips_mask_class_init:
  105|      1|{
  106|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  107|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  108|      1|	VipsPointClass *point_class = VIPS_POINT_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_POINT, VipsPointClass))
  ------------------
  109|       |
  110|      1|	gobject_class->set_property = vips_object_set_property;
  111|      1|	gobject_class->get_property = vips_object_get_property;
  112|       |
  113|      1|	vobject_class->nickname = "mask";
  114|      1|	vobject_class->description = _("base class for frequency filters");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  115|       |
  116|      1|	point_class->point = vips_mask_point;
  117|      1|	point_class->min = 0.0;
  118|      1|	point_class->max = 1.0;
  119|      1|	point_class->interpretation = VIPS_INTERPRETATION_FOURIER;
  120|       |
  121|      1|	VIPS_ARG_BOOL(class, "optical", 5,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  122|      1|		_("Optical"),
  123|      1|		_("Rotate quadrants to optical space"),
  124|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  125|      1|		G_STRUCT_OFFSET(VipsMask, optical),
  126|      1|		FALSE);
  127|       |
  128|      1|	VIPS_ARG_BOOL(class, "reject", 5,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  129|      1|		_("Reject"),
  130|      1|		_("Invert the sense of the filter"),
  131|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  132|      1|		G_STRUCT_OFFSET(VipsMask, reject),
  133|      1|		FALSE);
  134|       |
  135|      1|	VIPS_ARG_BOOL(class, "nodc", 5,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  136|      1|		_("Nodc"),
  137|      1|		_("Remove DC component"),
  138|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  139|      1|		G_STRUCT_OFFSET(VipsMask, nodc),
  140|      1|		FALSE);
  141|      1|}

mask_butterworth.c:vips_mask_butterworth_class_init:
   77|      1|{
   78|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   79|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   80|      1|	VipsMaskClass *mask_class = VIPS_MASK_CLASS(class);
  ------------------
  |  |   49|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      1|		VIPS_TYPE_MASK, VipsMaskClass))
  ------------------
   81|       |
   82|      1|	gobject_class->set_property = vips_object_set_property;
   83|      1|	gobject_class->get_property = vips_object_get_property;
   84|       |
   85|      1|	vobject_class->nickname = "mask_butterworth";
   86|      1|	vobject_class->description = _("make a butterworth filter");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   87|       |
   88|      1|	mask_class->point = vips_mask_butterworth_point;
   89|       |
   90|      1|	VIPS_ARG_DOUBLE(class, "order", 6,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
   91|      1|		_("Order"),
   92|      1|		_("Filter order"),
   93|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
   94|      1|		G_STRUCT_OFFSET(VipsMaskButterworth, order),
   95|      1|		1.0, 1000000.0, 1.0);
   96|       |
   97|      1|	VIPS_ARG_DOUBLE(class, "frequency_cutoff", 7,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
   98|      1|		_("Frequency cutoff"),
   99|      1|		_("Frequency cutoff"),
  100|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  101|      1|		G_STRUCT_OFFSET(VipsMaskButterworth, frequency_cutoff),
  102|      1|		0.0, 1000000.0, 0.5);
  103|       |
  104|      1|	VIPS_ARG_DOUBLE(class, "amplitude_cutoff", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  105|      1|		_("Amplitude cutoff"),
  106|      1|		_("Amplitude cutoff"),
  107|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  108|      1|		G_STRUCT_OFFSET(VipsMaskButterworth, amplitude_cutoff),
  109|      1|		0.0, 1.0, 0.5);
  110|      1|}

mask_butterworth_band.c:vips_mask_butterworth_band_class_init:
  101|      1|{
  102|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  103|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  104|      1|	VipsMaskClass *mask_class = VIPS_MASK_CLASS(class);
  ------------------
  |  |   49|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      1|		VIPS_TYPE_MASK, VipsMaskClass))
  ------------------
  105|       |
  106|      1|	gobject_class->set_property = vips_object_set_property;
  107|      1|	gobject_class->get_property = vips_object_get_property;
  108|       |
  109|      1|	vobject_class->nickname = "mask_butterworth_band";
  110|      1|	vobject_class->description = _("make a butterworth_band filter");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  111|       |
  112|      1|	mask_class->point = vips_mask_butterworth_band_point;
  113|       |
  114|      1|	VIPS_ARG_DOUBLE(class, "order", 6,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  115|      1|		_("Order"),
  116|      1|		_("Filter order"),
  117|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  118|      1|		G_STRUCT_OFFSET(VipsMaskButterworthBand, order),
  119|      1|		1.0, 1000000.0, 1.0);
  120|       |
  121|      1|	VIPS_ARG_DOUBLE(class, "frequency_cutoff_x", 7,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  122|      1|		_("Frequency cutoff x"),
  123|      1|		_("Frequency cutoff x"),
  124|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  125|      1|		G_STRUCT_OFFSET(VipsMaskButterworthBand, frequency_cutoff_x),
  126|      1|		0.0, 1000000.0, 0.5);
  127|       |
  128|      1|	VIPS_ARG_DOUBLE(class, "frequency_cutoff_y", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  129|      1|		_("Frequency cutoff y"),
  130|      1|		_("Frequency cutoff y"),
  131|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  132|      1|		G_STRUCT_OFFSET(VipsMaskButterworthBand, frequency_cutoff_y),
  133|      1|		0.0, 1000000.0, 0.5);
  134|       |
  135|      1|	VIPS_ARG_DOUBLE(class, "radius", 9,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  136|      1|		_("Radius"),
  137|      1|		_("Radius of circle"),
  138|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  139|      1|		G_STRUCT_OFFSET(VipsMaskButterworthBand, radius),
  140|      1|		0.0, 1000000.0, 0.1);
  141|       |
  142|      1|	VIPS_ARG_DOUBLE(class, "amplitude_cutoff", 10,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  143|      1|		_("Amplitude cutoff"),
  144|      1|		_("Amplitude cutoff"),
  145|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  146|      1|		G_STRUCT_OFFSET(VipsMaskButterworthBand, amplitude_cutoff),
  147|      1|		0.0, 1.0, 0.5);
  148|      1|}

mask_butterworth_ring.c:vips_mask_butterworth_ring_class_init:
   92|      1|{
   93|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   94|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   95|      1|	VipsMaskClass *mask_class = VIPS_MASK_CLASS(class);
  ------------------
  |  |   49|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      1|		VIPS_TYPE_MASK, VipsMaskClass))
  ------------------
   96|       |
   97|      1|	gobject_class->set_property = vips_object_set_property;
   98|      1|	gobject_class->get_property = vips_object_get_property;
   99|       |
  100|      1|	vobject_class->nickname = "mask_butterworth_ring";
  101|      1|	vobject_class->description = _("make a butterworth ring filter");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  102|       |
  103|      1|	mask_class->point = vips_mask_butterworth_ring_point;
  104|       |
  105|      1|	VIPS_ARG_DOUBLE(class, "ringwidth", 20,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  106|      1|		_("Ringwidth"),
  107|      1|		_("Ringwidth"),
  108|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  109|      1|		G_STRUCT_OFFSET(VipsMaskButterworthRing, ringwidth),
  110|      1|		0.0, 1000000.0, 0.1);
  111|      1|}

mask_fractal.c:vips_mask_fractal_class_init:
   79|      1|{
   80|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   81|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   82|      1|	VipsMaskClass *mask_class = VIPS_MASK_CLASS(class);
  ------------------
  |  |   49|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      1|		VIPS_TYPE_MASK, VipsMaskClass))
  ------------------
   83|       |
   84|      1|	gobject_class->set_property = vips_object_set_property;
   85|      1|	gobject_class->get_property = vips_object_get_property;
   86|       |
   87|      1|	vobject_class->nickname = "mask_fractal";
   88|      1|	vobject_class->description = _("make fractal filter");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   89|       |
   90|      1|	mask_class->point = vips_mask_fractal_point;
   91|       |
   92|      1|	VIPS_ARG_DOUBLE(class, "fractal_dimension", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
   93|      1|		_("Fractal dimension"),
   94|      1|		_("Fractal dimension"),
   95|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
   96|      1|		G_STRUCT_OFFSET(VipsMaskFractal, fractal_dimension),
   97|      1|		2.0, 3.0, 2.5);
   98|      1|}

mask_gaussian.c:vips_mask_gaussian_class_init:
   72|      1|{
   73|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   74|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|      1|	VipsMaskClass *mask_class = VIPS_MASK_CLASS(class);
  ------------------
  |  |   49|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      1|		VIPS_TYPE_MASK, VipsMaskClass))
  ------------------
   76|       |
   77|      1|	gobject_class->set_property = vips_object_set_property;
   78|      1|	gobject_class->get_property = vips_object_get_property;
   79|       |
   80|      1|	vobject_class->nickname = "mask_gaussian";
   81|      1|	vobject_class->description = _("make a gaussian filter");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   82|       |
   83|      1|	mask_class->point = vips_mask_gaussian_point;
   84|       |
   85|      1|	VIPS_ARG_DOUBLE(class, "frequency_cutoff", 7,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
   86|      1|		_("Frequency cutoff"),
   87|      1|		_("Frequency cutoff"),
   88|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
   89|      1|		G_STRUCT_OFFSET(VipsMaskGaussian, frequency_cutoff),
   90|      1|		0.0, 1000000.0, 0.5);
   91|       |
   92|      1|	VIPS_ARG_DOUBLE(class, "amplitude_cutoff", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
   93|      1|		_("Amplitude cutoff"),
   94|      1|		_("Amplitude cutoff"),
   95|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
   96|      1|		G_STRUCT_OFFSET(VipsMaskGaussian, amplitude_cutoff),
   97|      1|		0.0, 1.0, 0.5);
   98|      1|}

mask_gaussian_band.c:vips_mask_gaussian_band_class_init:
   93|      1|{
   94|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   95|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   96|      1|	VipsMaskClass *mask_class = VIPS_MASK_CLASS(class);
  ------------------
  |  |   49|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      1|		VIPS_TYPE_MASK, VipsMaskClass))
  ------------------
   97|       |
   98|      1|	gobject_class->set_property = vips_object_set_property;
   99|      1|	gobject_class->get_property = vips_object_get_property;
  100|       |
  101|      1|	vobject_class->nickname = "mask_gaussian_band";
  102|      1|	vobject_class->description = _("make a gaussian filter");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  103|       |
  104|      1|	mask_class->point = vips_mask_gaussian_band_point;
  105|       |
  106|      1|	VIPS_ARG_DOUBLE(class, "frequency_cutoff_x", 7,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  107|      1|		_("Frequency cutoff x"),
  108|      1|		_("Frequency cutoff x"),
  109|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  110|      1|		G_STRUCT_OFFSET(VipsMaskGaussianBand, frequency_cutoff_x),
  111|      1|		0.0, 1000000.0, 0.5);
  112|       |
  113|      1|	VIPS_ARG_DOUBLE(class, "frequency_cutoff_y", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  114|      1|		_("Frequency cutoff y"),
  115|      1|		_("Frequency cutoff y"),
  116|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  117|      1|		G_STRUCT_OFFSET(VipsMaskGaussianBand, frequency_cutoff_y),
  118|      1|		0.0, 1000000.0, 0.5);
  119|       |
  120|      1|	VIPS_ARG_DOUBLE(class, "radius", 9,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  121|      1|		_("Radius"),
  122|      1|		_("Radius of circle"),
  123|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  124|      1|		G_STRUCT_OFFSET(VipsMaskGaussianBand, radius),
  125|      1|		0.0, 1000000.0, 0.1);
  126|       |
  127|      1|	VIPS_ARG_DOUBLE(class, "amplitude_cutoff", 10,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  128|      1|		_("Amplitude cutoff"),
  129|      1|		_("Amplitude cutoff"),
  130|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  131|      1|		G_STRUCT_OFFSET(VipsMaskGaussianBand, amplitude_cutoff),
  132|      1|		0.0, 1.0, 0.5);
  133|      1|}

mask_gaussian_ring.c:vips_mask_gaussian_ring_class_init:
   87|      1|{
   88|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   89|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   90|      1|	VipsMaskClass *mask_class = VIPS_MASK_CLASS(class);
  ------------------
  |  |   49|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      1|		VIPS_TYPE_MASK, VipsMaskClass))
  ------------------
   91|       |
   92|      1|	gobject_class->set_property = vips_object_set_property;
   93|      1|	gobject_class->get_property = vips_object_get_property;
   94|       |
   95|      1|	vobject_class->nickname = "mask_gaussian_ring";
   96|      1|	vobject_class->description = _("make a gaussian ring filter");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   97|       |
   98|      1|	mask_class->point = vips_mask_gaussian_ring_point;
   99|       |
  100|      1|	VIPS_ARG_DOUBLE(class, "ringwidth", 20,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  101|      1|		_("Ringwidth"),
  102|      1|		_("Ringwidth"),
  103|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  104|      1|		G_STRUCT_OFFSET(VipsMaskGaussianRing, ringwidth),
  105|      1|		0.0, 1000000.0, 0.5);
  106|      1|}

mask_ideal.c:vips_mask_ideal_class_init:
   70|      1|{
   71|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   72|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   73|      1|	VipsMaskClass *mask_class = VIPS_MASK_CLASS(class);
  ------------------
  |  |   49|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      1|		VIPS_TYPE_MASK, VipsMaskClass))
  ------------------
   74|       |
   75|      1|	gobject_class->set_property = vips_object_set_property;
   76|      1|	gobject_class->get_property = vips_object_get_property;
   77|       |
   78|      1|	vobject_class->nickname = "mask_ideal";
   79|      1|	vobject_class->description = _("make an ideal filter");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   80|       |
   81|      1|	mask_class->point = vips_mask_ideal_point;
   82|       |
   83|      1|	VIPS_ARG_DOUBLE(class, "frequency_cutoff", 6,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
   84|      1|		_("Frequency cutoff"),
   85|      1|		_("Frequency cutoff"),
   86|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
   87|      1|		G_STRUCT_OFFSET(VipsMaskIdeal, frequency_cutoff),
   88|      1|		0.0, 1000000.0, 0.5);
   89|      1|}

mask_ideal_band.c:vips_mask_ideal_band_class_init:
   84|      1|{
   85|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   86|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   87|      1|	VipsMaskClass *mask_class = VIPS_MASK_CLASS(class);
  ------------------
  |  |   49|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      1|		VIPS_TYPE_MASK, VipsMaskClass))
  ------------------
   88|       |
   89|      1|	gobject_class->set_property = vips_object_set_property;
   90|      1|	gobject_class->get_property = vips_object_get_property;
   91|       |
   92|      1|	vobject_class->nickname = "mask_ideal_band";
   93|      1|	vobject_class->description = _("make an ideal band filter");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   94|       |
   95|      1|	mask_class->point = vips_mask_ideal_band_point;
   96|       |
   97|      1|	VIPS_ARG_DOUBLE(class, "frequency_cutoff_x", 6,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
   98|      1|		_("Frequency cutoff x"),
   99|      1|		_("Frequency cutoff x"),
  100|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  101|      1|		G_STRUCT_OFFSET(VipsMaskIdealBand, frequency_cutoff_x),
  102|      1|		0.0, 1000000.0, 0.5);
  103|       |
  104|      1|	VIPS_ARG_DOUBLE(class, "frequency_cutoff_y", 7,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  105|      1|		_("Frequency cutoff y"),
  106|      1|		_("Frequency cutoff y"),
  107|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  108|      1|		G_STRUCT_OFFSET(VipsMaskIdealBand, frequency_cutoff_y),
  109|      1|		0.0, 1000000.0, 0.5);
  110|       |
  111|      1|	VIPS_ARG_DOUBLE(class, "radius", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  112|      1|		_("Radius"),
  113|      1|		_("Radius of circle"),
  114|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  115|      1|		G_STRUCT_OFFSET(VipsMaskIdealBand, radius),
  116|      1|		0.0, 1000000.0, 0.1);
  117|      1|}

mask_ideal_ring.c:vips_mask_ideal_ring_class_init:
   84|      1|{
   85|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   86|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   87|      1|	VipsMaskClass *mask_class = VIPS_MASK_CLASS(class);
  ------------------
  |  |   49|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      1|		VIPS_TYPE_MASK, VipsMaskClass))
  ------------------
   88|       |
   89|      1|	gobject_class->set_property = vips_object_set_property;
   90|      1|	gobject_class->get_property = vips_object_get_property;
   91|       |
   92|      1|	vobject_class->nickname = "mask_ideal_ring";
   93|      1|	vobject_class->description = _("make an ideal ring filter");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   94|       |
   95|      1|	mask_class->point = vips_mask_ideal_ring_point;
   96|       |
   97|      1|	VIPS_ARG_DOUBLE(class, "ringwidth", 20,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
   98|      1|		_("Ringwidth"),
   99|      1|		_("Ringwidth"),
  100|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  101|      1|		G_STRUCT_OFFSET(VipsMaskIdealRing, ringwidth),
  102|      1|		0.0, 1000000.0, 0.5);
  103|      1|}

perlin.c:vips_perlin_class_init:
  278|      1|{
  279|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  280|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  281|       |
  282|      1|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|      1|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
  283|       |
  284|      1|	VIPS_ONCE(&once, vips_perlin_make_tables, NULL);
  ------------------
  |  |   93|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|      1|	{ \
  |  |   95|      1|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|      1|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|      1| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|      1|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|      1|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|      1|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|      1|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|      1|   else                                         \
  |  |  |  |  |  |  931|      1|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|      1|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|      1|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|      1|			(void) g_once(ONCE, FUNC, CLIENT); \
  |  |  ------------------
  |  |  |  |  241|      1|  (((once)->status == G_ONCE_STATUS_READY) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (241:4): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  |  |  242|      1|   (once)->retval : \
  |  |  |  |  243|      1|   g_once_impl ((once), (func), (arg)))
  |  |  ------------------
  |  |   97|      1|	} \
  |  |   98|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  285|       |
  286|      1|	gobject_class->set_property = vips_object_set_property;
  287|      1|	gobject_class->get_property = vips_object_get_property;
  288|       |
  289|      1|	vobject_class->nickname = "perlin";
  290|      1|	vobject_class->description = _("make a perlin noise image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  291|      1|	vobject_class->build = vips_perlin_build;
  292|       |
  293|      1|	VIPS_ARG_INT(class, "width", 2,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  294|      1|		_("Width"),
  295|      1|		_("Image width in pixels"),
  296|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  297|      1|		G_STRUCT_OFFSET(VipsPerlin, width),
  298|      1|		1, VIPS_MAX_COORD, 1);
  299|       |
  300|      1|	VIPS_ARG_INT(class, "height", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  301|      1|		_("Height"),
  302|      1|		_("Image height in pixels"),
  303|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  304|      1|		G_STRUCT_OFFSET(VipsPerlin, height),
  305|      1|		1, VIPS_MAX_COORD, 1);
  306|       |
  307|      1|	VIPS_ARG_INT(class, "cell_size", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  308|      1|		_("Cell size"),
  309|      1|		_("Size of Perlin cells"),
  310|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  311|      1|		G_STRUCT_OFFSET(VipsPerlin, cell_size),
  312|      1|		1, VIPS_MAX_COORD, 256);
  313|       |
  314|      1|	VIPS_ARG_BOOL(class, "uchar", 4,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  315|      1|		_("Uchar"),
  316|      1|		_("Output an unsigned char image"),
  317|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  318|      1|		G_STRUCT_OFFSET(VipsPerlin, uchar),
  319|      1|		FALSE);
  320|       |
  321|      1|	VIPS_ARG_INT(class, "seed", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  322|      1|		_("Seed"),
  323|      1|		_("Random number seed"),
  324|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  325|      1|		G_STRUCT_OFFSET(VipsPerlin, seed),
  326|      1|		INT_MIN, INT_MAX, 0);
  327|      1|}
perlin.c:vips_perlin_make_tables:
  263|      1|{
  264|      1|	int i;
  265|       |
  266|    257|	for (i = 0; i < 256; i++) {
  ------------------
  |  Branch (266:14): [True: 256, False: 1]
  ------------------
  267|    256|		double angle = 2 * VIPS_PI * i / 256.0;
  ------------------
  |  |   47|    256|#define VIPS_PI (3.14159265358979323846)
  ------------------
  268|       |
  269|    256|		vips_perlin_cos[i] = cos(angle);
  270|    256|		vips_perlin_sin[i] = sin(angle);
  271|    256|	}
  272|       |
  273|      1|	return NULL;
  274|      1|}

point.c:vips_point_class_init:
  124|      1|{
  125|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  126|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  127|       |
  128|      1|	gobject_class->set_property = vips_object_set_property;
  129|      1|	gobject_class->get_property = vips_object_get_property;
  130|       |
  131|      1|	vobject_class->nickname = "point";
  132|      1|	vobject_class->description = _("make a point image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  133|      1|	vobject_class->build = vips_point_build;
  134|       |
  135|      1|	class->point = NULL;
  136|      1|	class->min = -1.0;
  137|      1|	class->max = 1.0;
  138|      1|	class->interpretation = VIPS_INTERPRETATION_MULTIBAND;
  139|       |
  140|      1|	VIPS_ARG_INT(class, "width", 2,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  141|      1|		_("Width"),
  142|      1|		_("Image width in pixels"),
  143|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  144|      1|		G_STRUCT_OFFSET(VipsPoint, width),
  145|      1|		1, VIPS_MAX_COORD, 1);
  146|       |
  147|      1|	VIPS_ARG_INT(class, "height", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  148|      1|		_("Height"),
  149|      1|		_("Image height in pixels"),
  150|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  151|      1|		G_STRUCT_OFFSET(VipsPoint, height),
  152|      1|		1, VIPS_MAX_COORD, 1);
  153|       |
  154|      1|	VIPS_ARG_BOOL(class, "uchar", 4,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  155|      1|		_("Uchar"),
  156|      1|		_("Output an unsigned char image"),
  157|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  158|      1|		G_STRUCT_OFFSET(VipsPoint, uchar),
  159|      1|		FALSE);
  160|      1|}

sdf.c:vips_sdf_class_init:
  290|      1|{
  291|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  292|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  293|       |
  294|      1|	VIPS_DEBUG_MSG("vips_sdf_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  295|       |
  296|      1|	gobject_class->set_property = vips_object_set_property;
  297|      1|	gobject_class->get_property = vips_object_get_property;
  298|       |
  299|      1|	vobject_class->nickname = "sdf";
  300|      1|	vobject_class->description = _("create an SDF image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  301|      1|	vobject_class->build = vips_sdf_build;
  302|       |
  303|      1|	VIPS_ARG_INT(class, "width", 2,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  304|      1|		_("Width"),
  305|      1|		_("Image width in pixels"),
  306|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  307|      1|		G_STRUCT_OFFSET(VipsSdf, width),
  308|      1|		1, VIPS_MAX_COORD, 1);
  309|       |
  310|      1|	VIPS_ARG_INT(class, "height", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  311|      1|		_("Height"),
  312|      1|		_("Image height in pixels"),
  313|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  314|      1|		G_STRUCT_OFFSET(VipsSdf, height),
  315|      1|		1, VIPS_MAX_COORD, 1);
  316|       |
  317|      1|	VIPS_ARG_ENUM(class, "shape", 8,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  318|      1|		_("Shape"),
  319|      1|		_("SDF shape to create"),
  320|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  321|      1|		G_STRUCT_OFFSET(VipsSdf, shape),
  322|      1|		VIPS_TYPE_SDF_SHAPE, VIPS_SDF_SHAPE_CIRCLE);
  323|       |
  324|      1|	VIPS_ARG_DOUBLE(class, "r", 9,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  325|      1|		_("r"),
  326|      1|		_("Radius"),
  327|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  328|      1|		G_STRUCT_OFFSET(VipsSdf, r),
  329|      1|		0.0, VIPS_MAX_COORD, 50);
  330|       |
  331|      1|	VIPS_ARG_BOXED(class, "a", 13,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  332|      1|		_("a"),
  333|      1|		_("Point a"),
  334|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  335|      1|		G_STRUCT_OFFSET(VipsSdf, a_area),
  336|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  337|       |
  338|      1|	VIPS_ARG_BOXED(class, "b", 14,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  339|      1|		_("b"),
  340|      1|		_("Point b"),
  341|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  342|      1|		G_STRUCT_OFFSET(VipsSdf, b_area),
  343|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  344|       |
  345|      1|	VIPS_ARG_BOXED(class, "corners", 15,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  346|      1|		_("corners"),
  347|      1|		_("Corner radii"),
  348|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  349|      1|		G_STRUCT_OFFSET(VipsSdf, corners_area),
  350|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  351|       |
  352|      1|}

sines.c:vips_sines_class_init:
  113|      1|{
  114|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  115|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  116|      1|	VipsPointClass *point_class = VIPS_POINT_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_POINT, VipsPointClass))
  ------------------
  117|       |
  118|      1|	gobject_class->set_property = vips_object_set_property;
  119|      1|	gobject_class->get_property = vips_object_get_property;
  120|       |
  121|      1|	vobject_class->nickname = "sines";
  122|      1|	vobject_class->description = _("make a 2D sine wave");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  123|      1|	vobject_class->build = vips_sines_build;
  124|       |
  125|      1|	point_class->point = vips_sines_point;
  126|       |
  127|      1|	VIPS_ARG_DOUBLE(class, "hfreq", 6,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  128|      1|		_("hfreq"),
  129|      1|		_("Horizontal spatial frequency"),
  130|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  131|      1|		G_STRUCT_OFFSET(VipsSines, hfreq),
  132|      1|		0.0, 10000.0, 0.5);
  133|       |
  134|      1|	VIPS_ARG_DOUBLE(class, "vfreq", 7,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  135|      1|		_("vfreq"),
  136|      1|		_("Vertical spatial frequency"),
  137|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  138|      1|		G_STRUCT_OFFSET(VipsSines, vfreq),
  139|      1|		0.0, 10000.0, 0.5);
  140|      1|}

tonelut.c:vips_tonelut_class_init:
  213|      1|{
  214|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  215|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  216|       |
  217|      1|	gobject_class->set_property = vips_object_set_property;
  218|      1|	gobject_class->get_property = vips_object_get_property;
  219|       |
  220|      1|	vobject_class->nickname = "tonelut";
  221|      1|	vobject_class->description = _("build a look-up table");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  222|      1|	vobject_class->build = vips_tonelut_build;
  223|       |
  224|      1|	VIPS_ARG_INT(class, "in_max", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  225|      1|		_("In-max"),
  226|      1|		_("Size of LUT to build"),
  227|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  228|      1|		G_STRUCT_OFFSET(VipsTonelut, in_max),
  229|      1|		1, 65535, 32767);
  230|       |
  231|      1|	VIPS_ARG_INT(class, "out_max", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  232|      1|		_("Out-max"),
  233|      1|		_("Maximum value in output LUT"),
  234|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  235|      1|		G_STRUCT_OFFSET(VipsTonelut, out_max),
  236|      1|		1, 65535, 32767);
  237|       |
  238|      1|	VIPS_ARG_DOUBLE(class, "Lb", 6,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  239|      1|		_("Black point"),
  240|      1|		_("Lowest value in output"),
  241|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  242|      1|		G_STRUCT_OFFSET(VipsTonelut, Lb),
  243|      1|		0, 100, 0);
  244|       |
  245|      1|	VIPS_ARG_DOUBLE(class, "Lw", 7,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  246|      1|		_("White point"),
  247|      1|		_("Highest value in output"),
  248|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  249|      1|		G_STRUCT_OFFSET(VipsTonelut, Lw),
  250|      1|		0, 100, 100);
  251|       |
  252|      1|	VIPS_ARG_DOUBLE(class, "Ps", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  253|      1|		_("Shadow point"),
  254|      1|		_("Position of shadow"),
  255|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  256|      1|		G_STRUCT_OFFSET(VipsTonelut, Ps),
  257|      1|		0, 1, 0.2);
  258|       |
  259|      1|	VIPS_ARG_DOUBLE(class, "Pm", 9,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  260|      1|		_("Mid-tone point"),
  261|      1|		_("Position of mid-tones"),
  262|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  263|      1|		G_STRUCT_OFFSET(VipsTonelut, Pm),
  264|      1|		0, 1, 0.5);
  265|       |
  266|      1|	VIPS_ARG_DOUBLE(class, "Ph", 10,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  267|      1|		_("Highlight point"),
  268|      1|		_("Position of highlights"),
  269|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  270|      1|		G_STRUCT_OFFSET(VipsTonelut, Ph),
  271|      1|		0, 1, 0.8);
  272|       |
  273|      1|	VIPS_ARG_DOUBLE(class, "S", 11,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  274|      1|		_("Shadow adjust"),
  275|      1|		_("Adjust shadows by this much"),
  276|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  277|      1|		G_STRUCT_OFFSET(VipsTonelut, S),
  278|      1|		-30, 30, 0);
  279|       |
  280|      1|	VIPS_ARG_DOUBLE(class, "M", 12,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  281|      1|		_("Mid-tone adjust"),
  282|      1|		_("Adjust mid-tones by this much"),
  283|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  284|      1|		G_STRUCT_OFFSET(VipsTonelut, M),
  285|      1|		-30, 30, 0);
  286|       |
  287|      1|	VIPS_ARG_DOUBLE(class, "H", 13,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  288|      1|		_("Highlight adjust"),
  289|      1|		_("Adjust highlights by this much"),
  290|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  291|      1|		G_STRUCT_OFFSET(VipsTonelut, H),
  292|      1|		-30, 30, 0);
  293|      1|}

worley.c:vips_worley_class_init:
  295|      1|{
  296|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  297|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  298|       |
  299|      1|	gobject_class->set_property = vips_object_set_property;
  300|      1|	gobject_class->get_property = vips_object_get_property;
  301|       |
  302|      1|	vobject_class->nickname = "worley";
  303|      1|	vobject_class->description = _("make a worley noise image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  304|      1|	vobject_class->build = vips_worley_build;
  305|       |
  306|      1|	VIPS_ARG_INT(class, "width", 2,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  307|      1|		_("Width"),
  308|      1|		_("Image width in pixels"),
  309|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  310|      1|		G_STRUCT_OFFSET(VipsWorley, width),
  311|      1|		1, VIPS_MAX_COORD, 1);
  312|       |
  313|      1|	VIPS_ARG_INT(class, "height", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  314|      1|		_("Height"),
  315|      1|		_("Image height in pixels"),
  316|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  317|      1|		G_STRUCT_OFFSET(VipsWorley, height),
  318|      1|		1, VIPS_MAX_COORD, 1);
  319|       |
  320|      1|	VIPS_ARG_INT(class, "cell_size", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  321|      1|		_("Cell size"),
  322|      1|		_("Size of Worley cells"),
  323|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  324|      1|		G_STRUCT_OFFSET(VipsWorley, cell_size),
  325|      1|		1, VIPS_MAX_COORD, 256);
  326|       |
  327|      1|	VIPS_ARG_INT(class, "seed", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  328|      1|		_("Seed"),
  329|      1|		_("Random number seed"),
  330|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  331|      1|		G_STRUCT_OFFSET(VipsWorley, seed),
  332|      1|		INT_MIN, INT_MAX, 0);
  333|      1|}

xyz.c:vips_xyz_class_init:
  176|      1|{
  177|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  178|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  179|       |
  180|      1|	VIPS_DEBUG_MSG("vips_xyz_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  181|       |
  182|      1|	gobject_class->set_property = vips_object_set_property;
  183|      1|	gobject_class->get_property = vips_object_get_property;
  184|       |
  185|      1|	vobject_class->nickname = "xyz";
  186|      1|	vobject_class->description =
  187|      1|		_("make an image where pixel values are coordinates");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  188|      1|	vobject_class->build = vips_xyz_build;
  189|       |
  190|      1|	VIPS_ARG_INT(class, "width", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  191|      1|		_("Width"),
  192|      1|		_("Image width in pixels"),
  193|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  194|      1|		G_STRUCT_OFFSET(VipsXyz, width),
  195|      1|		1, VIPS_MAX_COORD, 64);
  196|       |
  197|      1|	VIPS_ARG_INT(class, "height", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  198|      1|		_("Height"),
  199|      1|		_("Image height in pixels"),
  200|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  201|      1|		G_STRUCT_OFFSET(VipsXyz, height),
  202|      1|		1, VIPS_MAX_COORD, 64);
  203|       |
  204|      1|	VIPS_ARG_INT(class, "csize", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  205|      1|		_("csize"),
  206|      1|		_("Size of third dimension"),
  207|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  208|      1|		G_STRUCT_OFFSET(VipsXyz, csize),
  209|      1|		1, VIPS_MAX_COORD, 1);
  210|       |
  211|      1|	VIPS_ARG_INT(class, "dsize", 7,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  212|      1|		_("dsize"),
  213|      1|		_("Size of fourth dimension"),
  214|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  215|      1|		G_STRUCT_OFFSET(VipsXyz, dsize),
  216|      1|		1, VIPS_MAX_COORD, 1);
  217|       |
  218|      1|	VIPS_ARG_INT(class, "esize", 8,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  219|      1|		_("esize"),
  220|      1|		_("Size of fifth dimension"),
  221|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  222|      1|		G_STRUCT_OFFSET(VipsXyz, esize),
  223|      1|		1, VIPS_MAX_COORD, 1);
  224|      1|}

zone.c:vips_zone_class_init:
   85|      1|{
   86|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   87|      1|	VipsPointClass *point_class = VIPS_POINT_CLASS(class);
  ------------------
  |  |   43|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      1|		VIPS_TYPE_POINT, VipsPointClass))
  ------------------
   88|       |
   89|      1|	vobject_class->nickname = "zone";
   90|      1|	vobject_class->description = _("make a zone plate");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   91|       |
   92|      1|	point_class->point = vips_zone_point;
   93|      1|}

vips_draw_operation_init:
  151|      2|{
  152|      2|	extern GType vips_draw_rect_get_type(void);
  153|      2|	extern GType vips_draw_image_get_type(void);
  154|      2|	extern GType vips_draw_mask_get_type(void);
  155|      2|	extern GType vips_draw_line_get_type(void);
  156|      2|	extern GType vips_draw_circle_get_type(void);
  157|      2|	extern GType vips_draw_flood_get_type(void);
  158|      2|	extern GType vips_draw_smudge_get_type(void);
  159|       |
  160|      2|	vips_draw_rect_get_type();
  161|      2|	vips_draw_image_get_type();
  162|      2|	vips_draw_mask_get_type();
  163|      2|	vips_draw_line_get_type();
  164|      2|	vips_draw_circle_get_type();
  165|      2|	vips_draw_flood_get_type();
  166|      2|	vips_draw_smudge_get_type();
  167|      2|}
draw.c:vips_draw_class_init:
  122|      1|{
  123|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  124|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  125|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  126|       |
  127|      1|	gobject_class->set_property = vips_object_set_property;
  128|      1|	gobject_class->get_property = vips_object_get_property;
  129|       |
  130|      1|	vobject_class->nickname = "draw";
  131|      1|	vobject_class->description = _("draw operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  132|      1|	vobject_class->build = vips_draw_build;
  133|       |
  134|       |	// no draw operation is cached
  135|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  136|       |
  137|      1|	VIPS_ARG_IMAGE(class, "image", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  138|      1|		_("Image"),
  139|      1|		_("Image to draw on"),
  140|      1|		VIPS_ARGUMENT_REQUIRED_INPUT | VIPS_ARGUMENT_MODIFY,
  141|      1|		G_STRUCT_OFFSET(VipsDraw, image));
  142|      1|}

draw_circle.c:vips_draw_circle_class_init:
  222|      1|{
  223|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  224|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  225|       |
  226|      1|	gobject_class->set_property = vips_object_set_property;
  227|      1|	gobject_class->get_property = vips_object_get_property;
  228|       |
  229|      1|	vobject_class->nickname = "draw_circle";
  230|      1|	vobject_class->description = _("draw a circle on an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  231|      1|	vobject_class->build = vips_draw_circle_build;
  232|       |
  233|      1|	VIPS_ARG_INT(class, "cx", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  234|      1|		_("cx"),
  235|      1|		_("Centre of draw_circle"),
  236|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  237|      1|		G_STRUCT_OFFSET(VipsDrawCircle, cx),
  238|      1|		-1000000000, 1000000000, 0);
  239|       |
  240|      1|	VIPS_ARG_INT(class, "cy", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  241|      1|		_("cy"),
  242|      1|		_("Centre of draw_circle"),
  243|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  244|      1|		G_STRUCT_OFFSET(VipsDrawCircle, cy),
  245|      1|		-1000000000, 1000000000, 0);
  246|       |
  247|      1|	VIPS_ARG_INT(class, "radius", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  248|      1|		_("Radius"),
  249|      1|		_("Radius in pixels"),
  250|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  251|      1|		G_STRUCT_OFFSET(VipsDrawCircle, radius),
  252|      1|		0, 1000000000, 0);
  253|       |
  254|      1|	VIPS_ARG_BOOL(class, "fill", 6,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  255|      1|		_("Fill"),
  256|      1|		_("Draw a solid object"),
  257|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  258|      1|		G_STRUCT_OFFSET(VipsDrawCircle, fill),
  259|      1|		FALSE);
  260|      1|}

draw_flood.c:vips_draw_flood_class_init:
  554|      1|{
  555|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  556|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  557|       |
  558|      1|	gobject_class->set_property = vips_object_set_property;
  559|      1|	gobject_class->get_property = vips_object_get_property;
  560|       |
  561|      1|	vobject_class->nickname = "draw_flood";
  562|      1|	vobject_class->description = _("flood-fill an area");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  563|      1|	vobject_class->build = vips_draw_flood_build;
  564|       |
  565|      1|	VIPS_ARG_INT(class, "x", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  566|      1|		_("x"),
  567|      1|		_("DrawFlood start point"),
  568|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  569|      1|		G_STRUCT_OFFSET(VipsDrawFlood, x),
  570|      1|		0, 1000000000, 0);
  571|       |
  572|      1|	VIPS_ARG_INT(class, "y", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  573|      1|		_("y"),
  574|      1|		_("DrawFlood start point"),
  575|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  576|      1|		G_STRUCT_OFFSET(VipsDrawFlood, y),
  577|      1|		0, 1000000000, 0);
  578|       |
  579|      1|	VIPS_ARG_IMAGE(class, "test", 5,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  580|      1|		_("Test"),
  581|      1|		_("Test pixels in this image"),
  582|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  583|      1|		G_STRUCT_OFFSET(VipsDrawFlood, test));
  584|       |
  585|      1|	VIPS_ARG_BOOL(class, "equal", 6,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  586|      1|		_("Equal"),
  587|      1|		_("DrawFlood while equal to edge"),
  588|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  589|      1|		G_STRUCT_OFFSET(VipsDrawFlood, equal),
  590|      1|		FALSE);
  591|       |
  592|      1|	VIPS_ARG_INT(class, "left", 7,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  593|      1|		_("Left"),
  594|      1|		_("Left edge of modified area"),
  595|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  596|      1|		G_STRUCT_OFFSET(VipsDrawFlood, left),
  597|      1|		0, 1000000000, 0);
  598|       |
  599|      1|	VIPS_ARG_INT(class, "top", 8,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  600|      1|		_("Top"),
  601|      1|		_("Top edge of modified area"),
  602|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  603|      1|		G_STRUCT_OFFSET(VipsDrawFlood, top),
  604|      1|		0, 1000000000, 0);
  605|       |
  606|      1|	VIPS_ARG_INT(class, "width", 9,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  607|      1|		_("Width"),
  608|      1|		_("Width of modified area"),
  609|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  610|      1|		G_STRUCT_OFFSET(VipsDrawFlood, width),
  611|      1|		0, 1000000000, 0);
  612|       |
  613|      1|	VIPS_ARG_INT(class, "height", 10,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  614|      1|		_("Height"),
  615|      1|		_("Height of modified area"),
  616|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  617|      1|		G_STRUCT_OFFSET(VipsDrawFlood, height),
  618|      1|		0, 1000000000, 0);
  619|      1|}

draw_image.c:vips_draw_image_class_init:
  257|      1|{
  258|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  259|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  260|       |
  261|      1|	gobject_class->set_property = vips_object_set_property;
  262|      1|	gobject_class->get_property = vips_object_get_property;
  263|       |
  264|      1|	vobject_class->nickname = "draw_image";
  265|      1|	vobject_class->description = _("paint an image into another image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  266|      1|	vobject_class->build = vips_draw_image_build;
  267|       |
  268|      1|	VIPS_ARG_IMAGE(class, "sub", 5,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  269|      1|		_("Sub-image"),
  270|      1|		_("Sub-image to insert into main image"),
  271|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  272|      1|		G_STRUCT_OFFSET(VipsDrawImage, sub));
  273|       |
  274|      1|	VIPS_ARG_INT(class, "x", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  275|      1|		_("x"),
  276|      1|		_("Draw image here"),
  277|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  278|      1|		G_STRUCT_OFFSET(VipsDrawImage, x),
  279|      1|		-1000000000, 1000000000, 0);
  280|       |
  281|      1|	VIPS_ARG_INT(class, "y", 7,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  282|      1|		_("y"),
  283|      1|		_("Draw image here"),
  284|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  285|      1|		G_STRUCT_OFFSET(VipsDrawImage, y),
  286|      1|		-1000000000, 1000000000, 0);
  287|       |
  288|      1|	VIPS_ARG_ENUM(class, "mode", 8,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  289|      1|		_("Mode"),
  290|      1|		_("Combining mode"),
  291|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  292|      1|		G_STRUCT_OFFSET(VipsDrawImage, mode),
  293|      1|		VIPS_TYPE_COMBINE_MODE, VIPS_COMBINE_MODE_SET);
  294|      1|}

draw_line.c:vips_draw_line_class_init:
  272|      1|{
  273|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  274|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  275|       |
  276|      1|	gobject_class->set_property = vips_object_set_property;
  277|      1|	gobject_class->get_property = vips_object_get_property;
  278|       |
  279|      1|	vobject_class->nickname = "draw_line";
  280|      1|	vobject_class->description = _("draw a line on an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  281|      1|	vobject_class->build = vips_draw_line_build;
  282|       |
  283|      1|	VIPS_ARG_INT(class, "x1", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  284|      1|		_("x1"),
  285|      1|		_("Start of draw_line"),
  286|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  287|      1|		G_STRUCT_OFFSET(VipsDrawLine, x1),
  288|      1|		-1000000000, 1000000000, 0);
  289|       |
  290|      1|	VIPS_ARG_INT(class, "y1", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  291|      1|		_("y1"),
  292|      1|		_("Start of draw_line"),
  293|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  294|      1|		G_STRUCT_OFFSET(VipsDrawLine, y1),
  295|      1|		-1000000000, 1000000000, 0);
  296|       |
  297|      1|	VIPS_ARG_INT(class, "x2", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  298|      1|		_("x2"),
  299|      1|		_("End of draw_line"),
  300|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  301|      1|		G_STRUCT_OFFSET(VipsDrawLine, x2),
  302|      1|		-1000000000, 1000000000, 0);
  303|       |
  304|      1|	VIPS_ARG_INT(class, "y2", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  305|      1|		_("y2"),
  306|      1|		_("End of draw_line"),
  307|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  308|      1|		G_STRUCT_OFFSET(VipsDrawLine, y2),
  309|      1|		-1000000000, 1000000000, 0);
  310|      1|}

draw_mask.c:vips_draw_mask_class_init:
  320|      1|{
  321|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  322|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  323|       |
  324|      1|	gobject_class->set_property = vips_object_set_property;
  325|      1|	gobject_class->get_property = vips_object_get_property;
  326|       |
  327|      1|	vobject_class->nickname = "draw_mask";
  328|      1|	vobject_class->description = _("draw a mask on an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  329|      1|	vobject_class->build = vips_draw_mask_build;
  330|       |
  331|      1|	VIPS_ARG_IMAGE(class, "mask", 5,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  332|      1|		_("Mask"),
  333|      1|		_("Mask of pixels to draw"),
  334|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  335|      1|		G_STRUCT_OFFSET(VipsDrawMask, mask));
  336|       |
  337|      1|	VIPS_ARG_INT(class, "x", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  338|      1|		_("x"),
  339|      1|		_("Draw mask here"),
  340|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  341|      1|		G_STRUCT_OFFSET(VipsDrawMask, x),
  342|      1|		-1000000000, 1000000000, 0);
  343|       |
  344|      1|	VIPS_ARG_INT(class, "y", 7,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  345|      1|		_("y"),
  346|      1|		_("Draw mask here"),
  347|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  348|      1|		G_STRUCT_OFFSET(VipsDrawMask, y),
  349|      1|		-1000000000, 1000000000, 0);
  350|      1|}

draw_rect.c:vips_draw_rect_class_init:
  161|      1|{
  162|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  163|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  164|       |
  165|      1|	gobject_class->set_property = vips_object_set_property;
  166|      1|	gobject_class->get_property = vips_object_get_property;
  167|       |
  168|      1|	vobject_class->nickname = "draw_rect";
  169|      1|	vobject_class->description = _("paint a rectangle on an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  170|      1|	vobject_class->build = vips_draw_rect_build;
  171|       |
  172|      1|	VIPS_ARG_INT(class, "left", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  173|      1|		_("Left"),
  174|      1|		_("Rect to fill"),
  175|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  176|      1|		G_STRUCT_OFFSET(VipsDrawRect, left),
  177|      1|		-1000000000, 1000000000, 0);
  178|       |
  179|      1|	VIPS_ARG_INT(class, "top", 7,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  180|      1|		_("Top"),
  181|      1|		_("Rect to fill"),
  182|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  183|      1|		G_STRUCT_OFFSET(VipsDrawRect, top),
  184|      1|		-1000000000, 1000000000, 0);
  185|       |
  186|      1|	VIPS_ARG_INT(class, "width", 8,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  187|      1|		_("Width"),
  188|      1|		_("Rect to fill"),
  189|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  190|      1|		G_STRUCT_OFFSET(VipsDrawRect, width),
  191|      1|		-1000000000, 1000000000, 0);
  192|       |
  193|      1|	VIPS_ARG_INT(class, "height", 9,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  194|      1|		_("Height"),
  195|      1|		_("Rect to fill"),
  196|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  197|      1|		G_STRUCT_OFFSET(VipsDrawRect, height),
  198|      1|		-1000000000, 1000000000, 0);
  199|       |
  200|      1|	VIPS_ARG_BOOL(class, "fill", 10,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  201|      1|		_("Fill"),
  202|      1|		_("Draw a solid object"),
  203|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  204|      1|		G_STRUCT_OFFSET(VipsDrawRect, fill),
  205|      1|		FALSE);
  206|      1|}

draw_smudge.c:vips_draw_smudge_class_init:
  203|      1|{
  204|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  206|       |
  207|      1|	gobject_class->set_property = vips_object_set_property;
  208|      1|	gobject_class->get_property = vips_object_get_property;
  209|       |
  210|      1|	vobject_class->nickname = "draw_smudge";
  211|      1|	vobject_class->description = _("blur a rectangle on an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  212|      1|	vobject_class->build = vips_draw_smudge_build;
  213|       |
  214|      1|	VIPS_ARG_INT(class, "left", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  215|      1|		_("Left"),
  216|      1|		_("Rect to fill"),
  217|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  218|      1|		G_STRUCT_OFFSET(VipsDrawSmudge, left),
  219|      1|		-1000000000, 1000000000, 0);
  220|       |
  221|      1|	VIPS_ARG_INT(class, "top", 7,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  222|      1|		_("Top"),
  223|      1|		_("Rect to fill"),
  224|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  225|      1|		G_STRUCT_OFFSET(VipsDrawSmudge, top),
  226|      1|		-1000000000, 1000000000, 0);
  227|       |
  228|      1|	VIPS_ARG_INT(class, "width", 8,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  229|      1|		_("Width"),
  230|      1|		_("Rect to fill"),
  231|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  232|      1|		G_STRUCT_OFFSET(VipsDrawSmudge, width),
  233|      1|		-1000000000, 1000000000, 0);
  234|       |
  235|      1|	VIPS_ARG_INT(class, "height", 9,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  236|      1|		_("Height"),
  237|      1|		_("Rect to fill"),
  238|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  239|      1|		G_STRUCT_OFFSET(VipsDrawSmudge, height),
  240|      1|		-1000000000, 1000000000, 0);
  241|      1|}

drawink.c:vips_drawink_class_init:
   78|      1|{
   79|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   80|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   81|       |
   82|      1|	gobject_class->set_property = vips_object_set_property;
   83|      1|	gobject_class->get_property = vips_object_get_property;
   84|       |
   85|      1|	vobject_class->nickname = "drawink";
   86|      1|	vobject_class->description = _("draw with ink operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   87|      1|	vobject_class->build = vips_drawink_build;
   88|       |
   89|      1|	VIPS_ARG_BOXED(class, "ink", 2,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
   90|      1|		_("Ink"),
   91|      1|		_("Color for pixels"),
   92|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
   93|      1|		G_STRUCT_OFFSET(VipsDrawink, ink),
   94|      1|		VIPS_TYPE_ARRAY_DOUBLE);
   95|      1|}

analyzeload.c:vips_foreign_load_analyze_class_init:
  109|      1|{
  110|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  111|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  112|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  113|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  114|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  115|       |
  116|      1|	gobject_class->set_property = vips_object_set_property;
  117|      1|	gobject_class->get_property = vips_object_get_property;
  118|       |
  119|      1|	object_class->nickname = "analyzeload";
  120|      1|	object_class->description = _("load an Analyze6 image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  121|       |
  122|       |	/* This is fuzzed, but you're unlikely to want to use it on
  123|       |	 * untrusted files.
  124|       |	 */
  125|      1|	operation_class->flags |= VIPS_OPERATION_UNTRUSTED;
  126|       |
  127|      1|	foreign_class->suffs = vips_foreign_analyze_suffs;
  128|       |
  129|       |	/* is_a() is not that quick ... lower the priority.
  130|       |	 */
  131|      1|	foreign_class->priority = -50;
  132|       |
  133|      1|	load_class->is_a = vips__isanalyze;
  134|      1|	load_class->get_flags_filename =
  135|      1|		vips_foreign_load_analyze_get_flags_filename;
  136|      1|	load_class->get_flags = vips_foreign_load_analyze_get_flags;
  137|      1|	load_class->header = vips_foreign_load_analyze_header;
  138|      1|	load_class->load = vips_foreign_load_analyze_load;
  139|       |
  140|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  141|      1|		_("Filename"),
  142|      1|		_("Filename to load from"),
  143|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  144|      1|		G_STRUCT_OFFSET(VipsForeignLoadAnalyze, filename),
  145|      1|		NULL);
  146|      1|}

vips__bgra2rgba:
  111|      9|{
  112|      9|	int x;
  113|       |
  114|     18|	for (x = 0; x < n; x++) {
  ------------------
  |  Branch (114:14): [True: 9, False: 9]
  ------------------
  115|      9|		guint32 bgra = GUINT32_FROM_BE(p[x]);
  ------------------
  |  |  392|      9|#define GUINT32_FROM_BE(val)	(GUINT32_TO_BE (val))
  ------------------
  116|       |
  117|      9|		guint rgba;
  118|       |
  119|       |		/* Leave G and A, swap R and B.
  120|       |		 */
  121|      9|		rgba =
  122|      9|			(bgra & 0x00ff00ff) |
  123|      9|			(bgra & 0x0000ff00) << 16 |
  124|      9|			(bgra & 0xff000000) >> 16;
  125|       |
  126|      9|		p[x] = GUINT32_TO_BE(rgba);
  127|      9|	}
  128|      9|}

vips_foreign_save_cgif_pick_quantiser:
  401|  4.03k|{
  402|  4.03k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(cgif);
  ------------------
  |  |  441|  4.03k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  4.03k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  4.03k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  403|       |
  404|  4.03k|	VipsQuantiseResult *this_result;
  ------------------
  |  |   45|  4.03k|#define VipsQuantiseResult liq_result
  ------------------
  405|       |
  406|  4.03k|	if (vips__quantise_image_quantize_fixed(image, cgif->attr, &this_result)) {
  ------------------
  |  Branch (406:6): [True: 0, False: 4.03k]
  ------------------
  407|      0|		vips_error(class->nickname, "%s", _("quantisation failed"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  408|      0|		return -1;
  409|      0|	}
  410|       |
  411|       |	/* No global quantiser set up yet? Use this result.
  412|       |	 */
  413|  4.03k|	if (!cgif->quantisation_result) {
  ------------------
  |  Branch (413:6): [True: 4.03k, False: 0]
  ------------------
  414|       |#ifdef DEBUG_VERBOSE
  415|       |		printf("vips_foreign_save_cgif_pick_quantiser: "
  416|       |			   "global palette from first frame\n");
  417|       |#endif /*DEBUG_VERBOSE*/
  418|       |
  419|  4.03k|		cgif->quantisation_result = this_result;
  420|  4.03k|		cgif->n_palettes_generated += 1;
  421|       |
  422|  4.03k|		*result = this_result;
  423|  4.03k|		*use_local = FALSE;
  ------------------
  |  |  794|  4.03k|#define	FALSE	(0)
  ------------------
  424|  4.03k|	}
  425|      0|	else {
  426|       |		/* Compare the palette we just made to the palette for the previous
  427|       |		 * frame, and to the global palette.
  428|       |		 */
  429|      0|		const VipsQuantisePalette *global = vips__quantise_get_palette(
  430|      0|			cgif->quantisation_result);
  431|      0|		const VipsQuantisePalette *this = vips__quantise_get_palette(
  432|      0|			this_result);
  433|      0|		const VipsQuantisePalette *prev = vips__quantise_get_palette(
  434|      0|			cgif->previous_quantisation_result);
  435|       |
  436|      0|		double global_diff = vips__cgif_compare_palettes(this, global);
  437|      0|		double prev_diff = prev == global
  ------------------
  |  Branch (437:22): [True: 0, False: 0]
  ------------------
  438|      0|			? global_diff
  439|      0|			: vips__cgif_compare_palettes(this, prev);
  440|       |
  441|       |#ifdef DEBUG_VERBOSE
  442|       |		printf("vips_foreign_save_cgif_write_frame: "
  443|       |			   "this -> global distance = %g\n", global_diff);
  444|       |		printf("vips_foreign_save_cgif_write_frame: "
  445|       |			   "this -> prev distance = %g\n", prev_diff);
  446|       |		printf("vips_foreign_save_cgif_write_frame: "
  447|       |			   "threshold = %g\n", cgif->interpalette_maxerror);
  448|       |#endif /*DEBUG_VERBOSE*/
  449|       |
  450|      0|		if (global_diff <= prev_diff &&
  ------------------
  |  Branch (450:7): [True: 0, False: 0]
  ------------------
  451|      0|			global_diff < cgif->interpalette_maxerror) {
  ------------------
  |  Branch (451:4): [True: 0, False: 0]
  ------------------
  452|       |			/* Global is good enough, use that.
  453|       |			 */
  454|       |#ifdef DEBUG_VERBOSE
  455|       |			printf("vips_foreign_save_cgif_write_frame: "
  456|       |				   "using global palette\n");
  457|       |#endif /*DEBUG_VERBOSE*/
  458|       |
  459|      0|			VIPS_FREEF(vips__quantise_result_destroy, this_result);
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|      0|	} \
  |  |   48|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  460|      0|			VIPS_FREEF(vips__quantise_result_destroy,
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|      0|	} \
  |  |   48|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      0|				cgif->free_quantisation_result);
  462|       |
  463|      0|			*result = cgif->quantisation_result;
  464|      0|			*use_local = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  465|      0|		}
  466|      0|		else if (prev_diff < cgif->interpalette_maxerror) {
  ------------------
  |  Branch (466:12): [True: 0, False: 0]
  ------------------
  467|       |			/* Previous is good enough, use that again.
  468|       |			 */
  469|       |#ifdef DEBUG_VERBOSE
  470|       |			printf("vips_foreign_save_cgif_write_frame: "
  471|       |				   "using previous palette\n");
  472|       |#endif /*DEBUG_VERBOSE*/
  473|       |
  474|      0|			VIPS_FREEF(vips__quantise_result_destroy, this_result);
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|      0|	} \
  |  |   48|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  475|       |
  476|      0|			*result = cgif->previous_quantisation_result;
  477|      0|			*use_local = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  478|      0|		}
  479|      0|		else {
  480|       |			/* Nothing else works, we need a new local palette.
  481|       |			 */
  482|       |#ifdef DEBUG_VERBOSE
  483|       |			printf("vips_foreign_save_cgif_write_frame: "
  484|       |				   "using new local palette\n");
  485|       |#endif /*DEBUG_VERBOSE*/
  486|       |
  487|      0|			VIPS_FREEF(vips__quantise_result_destroy,
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|      0|	} \
  |  |   48|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  488|      0|				cgif->free_quantisation_result);
  489|      0|			cgif->free_quantisation_result = this_result;
  490|      0|			cgif->n_palettes_generated += 1;
  491|       |
  492|      0|			*result = this_result;
  493|      0|			*use_local = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  494|      0|		}
  495|      0|	}
  496|       |
  497|  4.03k|	cgif->previous_quantisation_result = *result;
  498|       |
  499|  4.03k|	return 0;
  500|  4.03k|}
cgifsave.c:vips_foreign_save_cgif_class_init:
  874|      1|{
  875|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  876|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  877|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  878|      1|	VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
  879|       |
  880|      1|	gobject_class->dispose = vips_foreign_save_cgif_dispose;
  881|      1|	gobject_class->set_property = vips_object_set_property;
  882|      1|	gobject_class->get_property = vips_object_get_property;
  883|       |
  884|      1|	object_class->nickname = "gifsave_base";
  885|      1|	object_class->description = _("save as gif");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  886|      1|	object_class->build = vips_foreign_save_cgif_build;
  887|       |
  888|      1|	foreign_class->suffs = vips__save_cgif_suffs;
  889|       |
  890|      1|	save_class->saveable = VIPS_SAVEABLE_RGBA_ONLY;
  891|      1|	save_class->format_table = bandfmt_gif;
  892|       |
  893|      1|	VIPS_ARG_DOUBLE(class, "dither", 10,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  894|      1|		_("Dithering"),
  895|      1|		_("Amount of dithering"),
  896|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  897|      1|		G_STRUCT_OFFSET(VipsForeignSaveCgif, dither),
  898|      1|		0.0, 1.0, 1.0);
  899|       |
  900|      1|	VIPS_ARG_INT(class, "effort", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  901|      1|		_("Effort"),
  902|      1|		_("Quantisation effort"),
  903|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  904|      1|		G_STRUCT_OFFSET(VipsForeignSaveCgif, effort),
  905|      1|		1, 10, 7);
  906|       |
  907|      1|	VIPS_ARG_INT(class, "bitdepth", 12,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  908|      1|		_("Bit depth"),
  909|      1|		_("Number of bits per pixel"),
  910|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  911|      1|		G_STRUCT_OFFSET(VipsForeignSaveCgif, bitdepth),
  912|      1|		1, 8, 8);
  913|       |
  914|      1|	VIPS_ARG_DOUBLE(class, "interframe_maxerror", 13,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  915|      1|		_("Maximum inter-frame error"),
  916|      1|		_("Maximum inter-frame error for transparency"),
  917|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  918|      1|		G_STRUCT_OFFSET(VipsForeignSaveCgif, interframe_maxerror),
  919|      1|		0, 32, 0.0);
  920|       |
  921|      1|	VIPS_ARG_BOOL(class, "reuse", 14,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  922|      1|		_("Reuse palette"),
  923|      1|		_("Reuse palette from input"),
  924|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  925|      1|		G_STRUCT_OFFSET(VipsForeignSaveCgif, reuse),
  926|      1|		FALSE);
  927|       |
  928|      1|	VIPS_ARG_DOUBLE(class, "interpalette_maxerror", 15,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  929|      1|		_("Maximum inter-palette error"),
  930|      1|		_("Maximum inter-palette error for palette reusage"),
  931|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  932|      1|		G_STRUCT_OFFSET(VipsForeignSaveCgif, interpalette_maxerror),
  933|      1|		0, 256, 3.0);
  934|       |
  935|      1|	VIPS_ARG_BOOL(class, "interlace", 16,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  936|      1|		_("Interlaced"),
  937|      1|		_("Generate an interlaced (progressive) GIF"),
  938|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  939|      1|		G_STRUCT_OFFSET(VipsForeignSaveCgif, interlace),
  940|      1|		FALSE);
  941|       |
  942|       |	/* Not a good thing to have enabled by default since it can cause very
  943|       |	 * mysterious behaviour that varies with the input image.
  944|       |	 */
  945|      1|	VIPS_ARG_BOOL(class, "reoptimise", 17,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  946|      1|		_("Reoptimise palettes"),
  947|      1|		_("Reoptimise colour palettes"),
  948|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  949|      1|		G_STRUCT_OFFSET(VipsForeignSaveCgif, reoptimise),
  950|      1|		FALSE);
  951|       |
  952|      1|	VIPS_ARG_BOOL(class, "keep_duplicate_frames", 18,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  953|      1|		_("Keep duplicate frames"),
  954|      1|		_("Keep duplicate frames in the output instead of combining them"),
  955|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  956|      1|		G_STRUCT_OFFSET(VipsForeignSaveCgif, keep_duplicate_frames),
  957|      1|		FALSE);
  958|      1|}
cgifsave.c:vips_foreign_save_cgif_dispose:
  157|  10.9k|{
  158|  10.9k|	VipsForeignSaveCgif *cgif = (VipsForeignSaveCgif *) gobject;
  159|       |
  160|  10.9k|	g_info("cgifsave: %d frames", cgif->page_number);
  ------------------
  |  |  341|  10.9k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  10.9k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|  10.9k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|  10.9k|                               __VA_ARGS__)
  ------------------
  161|  10.9k|	g_info("cgifsave: %d unique palettes", cgif->n_palettes_generated);
  ------------------
  |  |  341|  10.9k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  10.9k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|  10.9k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|  10.9k|                               __VA_ARGS__)
  ------------------
  162|       |
  163|  10.9k|	VIPS_FREEF(cgif_close, cgif->cgif_context);
  ------------------
  |  |   41|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  10.9k|	{ \
  |  |   43|  10.9k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 10.9k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  10.9k|	} \
  |  |   48|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  164|       |
  165|  10.9k|	VIPS_FREEF(vips__quantise_result_destroy, cgif->quantisation_result);
  ------------------
  |  |   41|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  10.9k|	{ \
  |  |   43|  10.9k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 4.03k, False: 6.88k]
  |  |  ------------------
  |  |   44|  4.03k|			(void) F((S)); \
  |  |   45|  4.03k|			(S) = 0; \
  |  |   46|  4.03k|		} \
  |  |   47|  10.9k|	} \
  |  |   48|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  166|  10.9k|	VIPS_FREEF(vips__quantise_result_destroy,
  ------------------
  |  |   41|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  10.9k|	{ \
  |  |   43|  10.9k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 10.9k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  10.9k|	} \
  |  |   48|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  167|  10.9k|		cgif->free_quantisation_result);
  168|  10.9k|	VIPS_FREEF(vips__quantise_attr_destroy, cgif->attr);
  ------------------
  |  |   41|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  10.9k|	{ \
  |  |   43|  10.9k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 10.9k, False: 2]
  |  |  ------------------
  |  |   44|  10.9k|			(void) F((S)); \
  |  |   45|  10.9k|			(S) = 0; \
  |  |   46|  10.9k|		} \
  |  |   47|  10.9k|	} \
  |  |   48|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  169|       |
  170|  10.9k|	VIPS_UNREF(cgif->target);
  ------------------
  |  |   57|  10.9k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  10.9k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  10.9k|	{ \
  |  |  |  |   43|  10.9k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 10.9k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  10.9k|			(void) F((S)); \
  |  |  |  |   45|  10.9k|			(S) = 0; \
  |  |  |  |   46|  10.9k|		} \
  |  |  |  |   47|  10.9k|	} \
  |  |  |  |   48|  10.9k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  171|       |
  172|  10.9k|	VIPS_FREE(cgif->index);
  ------------------
  |  |   50|  10.9k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  10.9k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  10.9k|	{ \
  |  |  |  |   43|  10.9k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 10.9k, False: 2]
  |  |  |  |  ------------------
  |  |  |  |   44|  10.9k|			(void) F((S)); \
  |  |  |  |   45|  10.9k|			(S) = 0; \
  |  |  |  |   46|  10.9k|		} \
  |  |  |  |   47|  10.9k|	} \
  |  |  |  |   48|  10.9k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  173|  10.9k|	VIPS_FREE(cgif->frame_bytes);
  ------------------
  |  |   50|  10.9k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  10.9k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  10.9k|	{ \
  |  |  |  |   43|  10.9k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 10.9k, False: 2]
  |  |  |  |  ------------------
  |  |  |  |   44|  10.9k|			(void) F((S)); \
  |  |  |  |   45|  10.9k|			(S) = 0; \
  |  |  |  |   46|  10.9k|		} \
  |  |  |  |   47|  10.9k|	} \
  |  |  |  |   48|  10.9k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  174|  10.9k|	VIPS_FREE(cgif->previous_frame);
  ------------------
  |  |   50|  10.9k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  10.9k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  10.9k|	{ \
  |  |  |  |   43|  10.9k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 10.9k, False: 2]
  |  |  |  |  ------------------
  |  |  |  |   44|  10.9k|			(void) F((S)); \
  |  |  |  |   45|  10.9k|			(S) = 0; \
  |  |  |  |   46|  10.9k|		} \
  |  |  |  |   47|  10.9k|	} \
  |  |  |  |   48|  10.9k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  175|       |
  176|  10.9k|	G_OBJECT_CLASS(vips_foreign_save_cgif_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  10.9k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  10.9k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  10.9k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  177|  10.9k|}
cgifsave.c:vips_foreign_save_cgif_build:
  733|  10.9k|{
  734|  10.9k|	VipsForeignSave *save = (VipsForeignSave *) object;
  735|  10.9k|	VipsForeignSaveCgif *cgif = (VipsForeignSaveCgif *) object;
  736|  10.9k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(cgif);
  ------------------
  |  |  441|  10.9k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  10.9k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  10.9k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  737|  10.9k|	VipsImage **t = (VipsImage **)
  738|  10.9k|		vips_object_local_array(VIPS_OBJECT(cgif), 2);
  ------------------
  |  |  433|  10.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  10.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  739|       |
  740|  10.9k|	if (VIPS_OBJECT_CLASS(vips_foreign_save_cgif_parent_class)->build(object))
  ------------------
  |  |  435|  10.9k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  10.9k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  10.9k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (740:6): [True: 2, False: 10.9k]
  ------------------
  741|      2|		return -1;
  742|       |
  743|  10.9k|	cgif->in = save->ready;
  744|       |
  745|       |	/* libimagequant only works with RGBA images.
  746|       |	 */
  747|  10.9k|	if (!vips_image_hasalpha(cgif->in)) {
  ------------------
  |  Branch (747:6): [True: 8.74k, False: 2.17k]
  ------------------
  748|  8.74k|		if (vips_addalpha(cgif->in, &t[1], NULL))
  ------------------
  |  Branch (748:7): [True: 0, False: 8.74k]
  ------------------
  749|      0|			return -1;
  750|  8.74k|		cgif->in = t[1];
  751|  8.74k|	}
  752|       |
  753|       |	/* Animation properties.
  754|       |	 */
  755|  10.9k|	if (vips_image_get_typeof(cgif->in, "delay"))
  ------------------
  |  Branch (755:6): [True: 173, False: 10.7k]
  ------------------
  756|    173|		vips_image_get_array_int(cgif->in, "delay",
  757|    173|			&cgif->delay, &cgif->delay_length);
  758|  10.9k|	if (vips_image_get_typeof(cgif->in, "loop"))
  ------------------
  |  Branch (758:6): [True: 173, False: 10.7k]
  ------------------
  759|    173|		vips_image_get_int(cgif->in, "loop", &cgif->loop);
  760|       |
  761|  10.9k|	cgif->frame_height = vips_image_get_page_height(cgif->in);
  762|  10.9k|	cgif->frame_width = cgif->in->Xsize;
  763|       |
  764|       |	/* Reject images that exceed the pixel limit of libimagequant,
  765|       |	 * or that exceed the GIF limit of 64k per axis.
  766|       |	 *
  767|       |	 * Frame width * height will fit in an int, though frame size will
  768|       |	 * need at least a uint.
  769|       |	 */
  770|  10.9k|	if ((guint64) cgif->frame_width * cgif->frame_height > INT_MAX / 4 ||
  ------------------
  |  Branch (770:6): [True: 0, False: 10.9k]
  ------------------
  771|  10.9k|		cgif->frame_width > 65535 ||
  ------------------
  |  Branch (771:3): [True: 0, False: 10.9k]
  ------------------
  772|  10.9k|		cgif->frame_height > 65535) {
  ------------------
  |  Branch (772:3): [True: 0, False: 10.9k]
  ------------------
  773|      0|		vips_error(class->nickname, "%s", _("frame too large"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  774|      0|		return -1;
  775|      0|	}
  776|       |
  777|       |	/* This RGBA frame as a contiguous buffer.
  778|       |	 */
  779|  10.9k|	cgif->frame_bytes = g_malloc0((size_t) 4 *
  780|  10.9k|		cgif->frame_width * cgif->frame_height);
  781|       |
  782|       |	/* The previous RGBA frame (for spotting pixels which haven't changed).
  783|       |	 */
  784|  10.9k|	cgif->previous_frame = g_malloc0((size_t) 4 *
  785|  10.9k|		cgif->frame_width * cgif->frame_height);
  786|       |
  787|       |	/* The frame index buffer.
  788|       |	 */
  789|  10.9k|	cgif->index = g_malloc0((size_t) cgif->frame_width * cgif->frame_height);
  790|       |
  791|       |	/* Set up libimagequant.
  792|       |	 */
  793|  10.9k|	cgif->attr = vips__quantise_attr_create();
  794|       |	/* Limit the number of colours to 255 so there is always one index
  795|       |	 * free for transparency optimization.
  796|       |	 */
  797|  10.9k|	vips__quantise_set_max_colors(cgif->attr,
  798|  10.9k|		VIPS_MIN(255, 1 << cgif->bitdepth));
  ------------------
  |  |   55|  10.9k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 10.9k, False: 0]
  |  |  ------------------
  ------------------
  799|  10.9k|	vips__quantise_set_quality(cgif->attr, 0, 100);
  800|  10.9k|	vips__quantise_set_speed(cgif->attr, 11 - cgif->effort);
  801|       |
  802|       |	/* Read the palette on the input if we've not been asked to
  803|       |	 * reoptimise.
  804|       |	 */
  805|  10.9k|	if (cgif->reuse &&
  ------------------
  |  Branch (805:6): [True: 0, False: 10.9k]
  ------------------
  806|  10.9k|		vips_image_get_typeof(cgif->in, "gif-palette")) {
  ------------------
  |  Branch (806:3): [True: 0, False: 0]
  ------------------
  807|      0|		if (vips_image_get_array_int(cgif->in, "gif-palette",
  ------------------
  |  Branch (807:7): [True: 0, False: 0]
  ------------------
  808|      0|				&cgif->palette, &cgif->n_colours))
  809|      0|			return -1;
  810|       |
  811|      0|		if (cgif->n_colours > 256) {
  ------------------
  |  Branch (811:7): [True: 0, False: 0]
  ------------------
  812|      0|			vips_error(class->nickname, "%s", _("gif-palette too large"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  813|      0|			return -1;
  814|      0|		}
  815|      0|	}
  816|       |
  817|  10.9k|	if (cgif->palette) {
  ------------------
  |  Branch (817:6): [True: 0, False: 10.9k]
  ------------------
  818|       |		/* Make a fake image from the input palette, and quantise that.
  819|       |		 * Add a zero pixel (transparent) in case the input image has
  820|       |		 * transparency.
  821|       |		 *
  822|       |		 * We know palette fits in 256 entries.
  823|       |		 */
  824|      0|		guint32 fake_image[257];
  825|      0|		VipsQuantiseImage *image;
  ------------------
  |  |   44|      0|#define VipsQuantiseImage liq_image
  ------------------
  826|       |
  827|      0|		memcpy(fake_image, cgif->palette, cgif->n_colours * sizeof(int));
  828|      0|		fake_image[cgif->n_colours] = 0;
  829|      0|		image = vips__quantise_image_create_rgba(cgif->attr,
  830|      0|			fake_image, cgif->n_colours + 1, 1, 0);
  831|       |
  832|      0|		if (vips__quantise_image_quantize_fixed(image,
  ------------------
  |  Branch (832:7): [True: 0, False: 0]
  ------------------
  833|      0|				cgif->attr, &cgif->quantisation_result)) {
  834|      0|			vips_error(class->nickname, "%s", _("quantisation failed"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  835|      0|			return -1;
  836|      0|		}
  837|       |
  838|      0|		VIPS_FREEF(vips__quantise_image_destroy, image);
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|      0|	} \
  |  |   48|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  839|      0|	}
  840|       |
  841|       |	/* Global mode if there's an input palette, or palette maxerror is
  842|       |	 * huge.
  843|       |	 */
  844|  10.9k|	if (cgif->palette ||
  ------------------
  |  Branch (844:6): [True: 0, False: 10.9k]
  ------------------
  845|  10.9k|		cgif->interpalette_maxerror > 255)
  ------------------
  |  Branch (845:3): [True: 0, False: 10.9k]
  ------------------
  846|      0|		cgif->mode = VIPS_FOREIGN_SAVE_CGIF_MODE_GLOBAL;
  847|  10.9k|	else
  848|  10.9k|		cgif->mode = VIPS_FOREIGN_SAVE_CGIF_MODE_LOCAL;
  849|       |
  850|  10.9k|	if (vips_sink_disc(cgif->in, vips_foreign_save_cgif_sink_disc, cgif))
  ------------------
  |  Branch (850:6): [True: 6.88k, False: 4.03k]
  ------------------
  851|  6.88k|		return -1;
  852|       |
  853|  10.9k|	VIPS_FREEF(cgif_close, cgif->cgif_context);
  ------------------
  |  |   41|  4.03k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.03k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  4.03k|	{ \
  |  |   43|  4.03k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 4.03k, False: 0]
  |  |  ------------------
  |  |   44|  4.03k|			(void) F((S)); \
  |  |   45|  4.03k|			(S) = 0; \
  |  |   46|  4.03k|		} \
  |  |   47|  4.03k|	} \
  |  |   48|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  854|       |
  855|  4.03k|	if (vips_target_end(cgif->target))
  ------------------
  |  Branch (855:6): [True: 0, False: 4.03k]
  ------------------
  856|      0|		return -1;
  857|       |
  858|  4.03k|	return 0;
  859|  4.03k|}
cgifsave.c:vips_foreign_save_cgif_sink_disc:
  704|  4.03k|{
  705|  4.03k|	VipsForeignSaveCgif *cgif = (VipsForeignSaveCgif *) a;
  706|  4.03k|	int line_size = cgif->frame_width * 4;
  707|       |
  708|       |#ifdef DEBUG_VERBOSE
  709|       |	printf("vips_foreign_save_cgif_sink_disc: strip at %d, height %d\n",
  710|       |		area->top, area->height);
  711|       |#endif /*DEBUG_VERBOSE*/
  712|       |
  713|   253k|	for (int y = 0; y < area->height; y++) {
  ------------------
  |  Branch (713:18): [True: 249k, False: 4.03k]
  ------------------
  714|   249k|		memcpy(cgif->frame_bytes + cgif->write_y * line_size,
  715|   249k|			VIPS_REGION_ADDR(region, 0, area->top + y),
  ------------------
  |  |  227|   249k|	((R)->data + \
  |  |  228|   249k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   249k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   249k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   249k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   249k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   249k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  716|   249k|			line_size);
  717|   249k|		cgif->write_y += 1;
  718|       |
  719|   249k|		if (cgif->write_y >= cgif->frame_height) {
  ------------------
  |  Branch (719:7): [True: 4.03k, False: 245k]
  ------------------
  720|  4.03k|			if (vips_foreign_save_cgif_write_frame(cgif))
  ------------------
  |  Branch (720:8): [True: 0, False: 4.03k]
  ------------------
  721|      0|				return -1;
  722|       |
  723|  4.03k|			cgif->write_y = 0;
  724|  4.03k|			cgif->page_number += 1;
  725|  4.03k|		}
  726|   249k|	}
  727|       |
  728|  4.03k|	return 0;
  729|  4.03k|}
cgifsave.c:vips_foreign_save_cgif_write_frame:
  506|  4.03k|{
  507|  4.03k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(cgif);
  ------------------
  |  |  441|  4.03k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  4.03k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  4.03k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  508|  4.03k|	int n_pels = cgif->frame_height * cgif->frame_width;
  509|       |
  510|  4.03k|	gboolean has_transparency;
  511|  4.03k|	gboolean has_alpha_constraint;
  512|  4.03k|	VipsPel *restrict p;
  513|  4.03k|	VipsQuantiseImage *image;
  ------------------
  |  |   44|  4.03k|#define VipsQuantiseImage liq_image
  ------------------
  514|  4.03k|	gboolean use_local;
  515|  4.03k|	VipsQuantiseResult *quantisation_result;
  ------------------
  |  |   45|  4.03k|#define VipsQuantiseResult liq_result
  ------------------
  516|  4.03k|	const VipsQuantisePalette *lp;
  517|  4.03k|	CGIF_FrameConfig frame_config = { 0 };
  518|  4.03k|	int n_colours;
  519|  4.03k|	VipsPel palette_rgb[256 * 3];
  520|       |
  521|       |#ifdef DEBUG_VERBOSE
  522|       |	printf("vips_foreign_save_cgif_write_frame: %d\n", cgif->page_number);
  523|       |#endif /*DEBUG_VERBOSE*/
  524|       |
  525|       |	/* Threshold the alpha channel.
  526|       |	 *
  527|       |	 * Also, check if the alpha channel of the current frame matches the
  528|       |	 * frame before.
  529|       |	 *
  530|       |	 * If the current frame has an alpha component which is not identical
  531|       |	 * to the previous frame we are forced to use the transparency index
  532|       |	 * for the alpha channel instead of for the transparency size
  533|       |	 * optimization (maxerror).
  534|       |	 */
  535|  4.03k|	p = cgif->frame_bytes;
  536|  4.03k|	has_alpha_constraint = FALSE;
  ------------------
  |  |  794|  4.03k|#define	FALSE	(0)
  ------------------
  537|  17.1M|	for (int i = 0; i < n_pels; i++) {
  ------------------
  |  Branch (537:18): [True: 17.1M, False: 4.03k]
  ------------------
  538|  17.1M|		if (p[3] >= 128)
  ------------------
  |  Branch (538:7): [True: 15.6M, False: 1.52M]
  ------------------
  539|  15.6M|			p[3] = 255;
  540|  1.52M|		else {
  541|       |			/* Helps the quantiser generate a better palette.
  542|       |			 */
  543|  1.52M|			p[0] = 0;
  544|  1.52M|			p[1] = 0;
  545|  1.52M|			p[2] = 0;
  546|  1.52M|			p[3] = 0;
  547|       |
  548|  1.52M|			if (cgif->page_number > 0 &&
  ------------------
  |  Branch (548:8): [True: 0, False: 1.52M]
  ------------------
  549|  1.52M|				cgif->previous_frame[i * 4 + 3])
  ------------------
  |  Branch (549:5): [True: 0, False: 0]
  ------------------
  550|      0|				has_alpha_constraint = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  551|  1.52M|		}
  552|       |
  553|  17.1M|		p += 4;
  554|  17.1M|	}
  555|       |
  556|       |	/* Set up new frame for libimagequant.
  557|       |	 */
  558|  4.03k|	image = vips__quantise_image_create_rgba(cgif->attr,
  559|  4.03k|		cgif->frame_bytes, cgif->frame_width, cgif->frame_height, 0);
  560|       |
  561|  4.03k|	if (cgif->mode == VIPS_FOREIGN_SAVE_CGIF_MODE_LOCAL ||
  ------------------
  |  Branch (561:6): [True: 4.03k, False: 0]
  ------------------
  562|  4.03k|		!cgif->quantisation_result) {
  ------------------
  |  Branch (562:3): [True: 0, False: 0]
  ------------------
  563|       |		/* Reoptimising each frame, or no global palette set up yet.
  564|       |		 */
  565|  4.03k|		if (vips_foreign_save_cgif_pick_quantiser(cgif,
  ------------------
  |  Branch (565:7): [True: 0, False: 4.03k]
  ------------------
  566|  4.03k|				image, &quantisation_result, &use_local))
  567|      0|			return -1;
  568|  4.03k|	}
  569|      0|	else {
  570|      0|		quantisation_result = cgif->quantisation_result;
  571|      0|		use_local = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  572|      0|	}
  573|       |
  574|  4.03k|	lp = vips__quantise_get_palette(quantisation_result);
  575|       |	/* If there's a transparent pixel, it's always first.
  576|       |	 */
  577|  4.03k|	has_transparency = lp->entries[0].a == 0;
  578|  4.03k|	n_colours = lp->count;
  579|  4.03k|	vips_foreign_save_cgif_get_rgb_palette(cgif,
  580|  4.03k|		quantisation_result, palette_rgb);
  581|       |
  582|       |	/* Dither frame into @index.
  583|       |	 */
  584|  4.03k|	vips__quantise_set_dithering_level(quantisation_result, cgif->dither);
  585|  4.03k|	if (vips__quantise_write_remapped_image(quantisation_result,
  ------------------
  |  Branch (585:6): [True: 0, False: 4.03k]
  ------------------
  586|  4.03k|			image, cgif->index, n_pels)) {
  587|      0|		vips_error(class->nickname, "%s", _("dither failed"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  588|      0|		VIPS_FREEF(vips__quantise_image_destroy, image);
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|      0|	} \
  |  |   48|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  589|      0|		return -1;
  590|      0|	}
  591|       |
  592|  4.03k|	VIPS_FREEF(vips__quantise_image_destroy, image);
  ------------------
  |  |   41|  4.03k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.03k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  4.03k|	{ \
  |  |   43|  4.03k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 4.03k, False: 0]
  |  |  ------------------
  |  |   44|  4.03k|			(void) F((S)); \
  |  |   45|  4.03k|			(S) = 0; \
  |  |   46|  4.03k|		} \
  |  |   47|  4.03k|	} \
  |  |   48|  4.03k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.03k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  593|       |
  594|       |	/* Remapping is relatively slow, trigger eval callbacks.
  595|       |	 */
  596|  4.03k|	vips_image_eval(cgif->in, n_pels);
  597|  4.03k|	if (vips_image_iskilled(cgif->in))
  ------------------
  |  Branch (597:6): [True: 0, False: 4.03k]
  ------------------
  598|      0|		return -1;
  599|       |
  600|       |	/* Set up cgif on first use.
  601|       |	 */
  602|  4.03k|	if (!cgif->cgif_context) {
  ------------------
  |  Branch (602:6): [True: 4.03k, False: 0]
  ------------------
  603|  4.03k|#ifdef HAVE_CGIF_GEN_KEEP_IDENT_FRAMES
  604|  4.03k|		if (cgif->keep_duplicate_frames)
  ------------------
  |  Branch (604:7): [True: 0, False: 4.03k]
  ------------------
  605|      0|			cgif->cgif_config.genFlags = CGIF_GEN_KEEP_IDENT_FRAMES;
  ------------------
  |  |   17|      0|#define CGIF_GEN_KEEP_IDENT_FRAMES       (1uL << 0)       // keep frames that are identical to previous frame (default is to drop them)
  ------------------
  606|  4.03k|#endif
  607|  4.03k|#ifdef HAVE_CGIF_ATTR_NO_LOOP
  608|  4.03k|		cgif->cgif_config.attrFlags =
  609|  4.03k|			CGIF_ATTR_IS_ANIMATED |
  ------------------
  |  |   12|  4.03k|#define CGIF_ATTR_IS_ANIMATED            (1uL << 1)       // make an animated GIF (default is non-animated GIF)
  ------------------
  610|  4.03k|			(cgif->loop == 1 ? CGIF_ATTR_NO_LOOP : 0);
  ------------------
  |  |   15|    118|#define CGIF_ATTR_NO_LOOP                (1uL << 4)       // don't loop a GIF animation: only play it one time.
  ------------------
  |  Branch (610:5): [True: 118, False: 3.91k]
  ------------------
  611|  4.03k|		cgif->cgif_config.numLoops = cgif->loop > 1
  ------------------
  |  Branch (611:32): [True: 2, False: 4.03k]
  ------------------
  612|  4.03k|			? cgif->loop - 1
  613|  4.03k|			: cgif->loop;
  614|       |#else  /*!HAVE_CGIF_ATTR_NO_LOOP*/
  615|       |		cgif->cgif_config.attrFlags = CGIF_ATTR_IS_ANIMATED;
  616|       |		cgif->cgif_config.numLoops = cgif->loop;
  617|       |#endif /*HAVE_CGIF_ATTR_NO_LOOP*/
  618|       |
  619|  4.03k|		cgif->cgif_config.width = cgif->frame_width;
  620|  4.03k|		cgif->cgif_config.height = cgif->frame_height;
  621|  4.03k|		cgif->cgif_config.pGlobalPalette = palette_rgb;
  622|  4.03k|		cgif->cgif_config.numGlobalPaletteEntries = n_colours;
  623|  4.03k|		cgif->cgif_config.pWriteFn = vips__cgif_write;
  624|  4.03k|		cgif->cgif_config.pContext = (void *) cgif->target;
  625|       |
  626|  4.03k|		cgif->cgif_context = cgif_newgif(&cgif->cgif_config);
  627|  4.03k|	}
  628|       |
  629|       |	/* Allow cgif to optimise by adding transparency. These optimisations
  630|       |	 * will be automatically disabled if they are not possible.
  631|       |	 */
  632|  4.03k|	frame_config.genFlags =
  633|  4.03k|		CGIF_FRAME_GEN_USE_TRANSPARENCY |
  ------------------
  |  |   24|  4.03k|#define CGIF_FRAME_GEN_USE_TRANSPARENCY  (1uL << 0)       // use transparency optimization (setting pixels identical to previous frame transparent)
  ------------------
  634|  4.03k|		CGIF_FRAME_GEN_USE_DIFF_WINDOW;
  ------------------
  |  |   25|  4.03k|#define CGIF_FRAME_GEN_USE_DIFF_WINDOW   (1uL << 1)       // do encoding just for the sub-window that has changed from previous frame
  ------------------
  635|  4.03k|	frame_config.attrFlags = 0;
  636|       |
  637|       |	/* Switch per-frame alpha channel on. Index 0 is used for pixels
  638|       |	 * with alpha channel.
  639|       |	 */
  640|  4.03k|	if (has_transparency) {
  ------------------
  |  Branch (640:6): [True: 3.58k, False: 450]
  ------------------
  641|  3.58k|		frame_config.attrFlags |= CGIF_FRAME_ATTR_HAS_ALPHA;
  ------------------
  |  |   20|  3.58k|#define CGIF_FRAME_ATTR_HAS_ALPHA        (1uL << 1)       // alpha channel index provided by user (transIndex field)
  ------------------
  642|  3.58k|		frame_config.transIndex = 0;
  643|  3.58k|	}
  644|       |
  645|       |	/* Pixels which are equal to pixels in the previous frame can be made
  646|       |	 * transparent, provided no alpha channel constraint is present.
  647|       |	 */
  648|  4.03k|	if (cgif->page_number > 0 &&
  ------------------
  |  Branch (648:6): [True: 0, False: 4.03k]
  ------------------
  649|  4.03k|		!has_alpha_constraint) {
  ------------------
  |  Branch (649:3): [True: 0, False: 0]
  ------------------
  650|      0|		int trans = has_transparency ? 0 : n_colours;
  ------------------
  |  Branch (650:15): [True: 0, False: 0]
  ------------------
  651|       |
  652|      0|		vips_foreign_save_cgif_set_transparent(cgif,
  653|      0|			cgif->previous_frame, cgif->frame_bytes, cgif->index,
  654|      0|			n_pels, cgif->frame_width, trans);
  655|       |
  656|      0|		if (has_transparency)
  ------------------
  |  Branch (656:7): [True: 0, False: 0]
  ------------------
  657|      0|			frame_config.attrFlags &= ~CGIF_FRAME_ATTR_HAS_ALPHA;
  ------------------
  |  |   20|      0|#define CGIF_FRAME_ATTR_HAS_ALPHA        (1uL << 1)       // alpha channel index provided by user (transIndex field)
  ------------------
  658|      0|		frame_config.attrFlags |= CGIF_FRAME_ATTR_HAS_SET_TRANS;
  ------------------
  |  |   21|      0|#define CGIF_FRAME_ATTR_HAS_SET_TRANS    (1uL << 2)       // transparency setting provided by user (transIndex field)
  ------------------
  659|      0|		frame_config.transIndex = trans;
  660|      0|	}
  661|  4.03k|	else {
  662|       |		/* Take a copy of the RGBA frame.
  663|       |		 */
  664|  4.03k|		memcpy(cgif->previous_frame, cgif->frame_bytes, 4 * n_pels);
  665|  4.03k|	}
  666|       |
  667|  4.03k|	if (cgif->delay &&
  ------------------
  |  Branch (667:6): [True: 120, False: 3.91k]
  ------------------
  668|  4.03k|		cgif->page_number < cgif->delay_length)
  ------------------
  |  Branch (668:3): [True: 120, False: 0]
  ------------------
  669|    120|		frame_config.delay =
  670|    120|			VIPS_RINT(cgif->delay[cgif->page_number] / 10.0);
  ------------------
  |  |   74|    120|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  671|       |
  672|       |	/* Attach a local palette, if we need one.
  673|       |	 */
  674|  4.03k|	if (use_local) {
  ------------------
  |  Branch (674:6): [True: 0, False: 4.03k]
  ------------------
  675|      0|		frame_config.attrFlags |= CGIF_FRAME_ATTR_USE_LOCAL_TABLE;
  ------------------
  |  |   19|      0|#define CGIF_FRAME_ATTR_USE_LOCAL_TABLE  (1uL << 0)       // use a local color table for a frame (local color table is not used by default)
  ------------------
  676|      0|		frame_config.pLocalPalette = palette_rgb;
  677|      0|		frame_config.numLocalPaletteEntries = n_colours;
  678|      0|	}
  679|       |
  680|       |	/* Write an interlaced GIF, if requested.
  681|       |	 */
  682|  4.03k|	if (cgif->interlace) {
  ------------------
  |  Branch (682:6): [True: 0, False: 4.03k]
  ------------------
  683|      0|#ifdef HAVE_CGIF_FRAME_ATTR_INTERLACED
  684|      0|		frame_config.attrFlags |= CGIF_FRAME_ATTR_INTERLACED;
  ------------------
  |  |   22|      0|#define CGIF_FRAME_ATTR_INTERLACED       (1uL << 3)       // encode frame interlaced (default is not interlaced)
  ------------------
  685|       |#else  /*!HAVE_CGIF_FRAME_ATTR_INTERLACED*/
  686|       |		g_warning("%s: cgif >= v0.3.0 required for interlaced GIF write",
  687|       |			class->nickname);
  688|       |#endif /*HAVE_CGIF_FRAME_ATTR_INTERLACED*/
  689|      0|	}
  690|       |
  691|       |	/* Write frame to cgif.
  692|       |	 */
  693|  4.03k|	frame_config.pImageData = cgif->index;
  694|  4.03k|	cgif_addframe(cgif->cgif_context, &frame_config);
  695|       |
  696|  4.03k|	return 0;
  697|  4.03k|}
cgifsave.c:vips_foreign_save_cgif_get_rgb_palette:
  383|  4.03k|{
  384|  4.03k|	const VipsQuantisePalette *lp =
  385|  4.03k|		vips__quantise_get_palette(quantisation_result);
  386|       |
  387|  4.03k|	g_assert(lp->count <= 256);
  ------------------
  |  |  166|  4.03k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  4.03k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.03k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  388|       |
  389|   228k|	for (int i = 0; i < lp->count; i++) {
  ------------------
  |  Branch (389:18): [True: 224k, False: 4.03k]
  ------------------
  390|   224k|		rgb[0] = lp->entries[i].r;
  391|   224k|		rgb[1] = lp->entries[i].g;
  392|   224k|		rgb[2] = lp->entries[i].b;
  393|       |
  394|   224k|		rgb += 3;
  395|   224k|	}
  396|  4.03k|}
cgifsave.c:vips__cgif_write:
  181|   127k|{
  182|   127k|	VipsTarget *target = VIPS_TARGET(client);
  ------------------
  |  |  382|   127k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   127k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   127k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  383|   127k|		VIPS_TYPE_TARGET, VipsTarget))
  ------------------
  183|       |
  184|   127k|	return vips_target_write(target, (const void *) buffer, (size_t) length);
  185|   127k|}
cgifsave.c:vips_foreign_save_cgif_init:
  962|  10.9k|{
  963|  10.9k|	gif->dither = 1.0;
  964|  10.9k|	gif->effort = 7;
  965|  10.9k|	gif->bitdepth = 8;
  966|  10.9k|	gif->interframe_maxerror = 0.0;
  967|  10.9k|	gif->reuse = FALSE;
  ------------------
  |  |  794|  10.9k|#define	FALSE	(0)
  ------------------
  968|  10.9k|	gif->interlace = FALSE;
  ------------------
  |  |  794|  10.9k|#define	FALSE	(0)
  ------------------
  969|  10.9k|	gif->interpalette_maxerror = 3.0;
  970|  10.9k|	gif->mode = VIPS_FOREIGN_SAVE_CGIF_MODE_GLOBAL;
  971|  10.9k|}
cgifsave.c:vips_foreign_save_cgif_target_class_init:
 1000|      1|{
 1001|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1002|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1003|       |
 1004|      1|	gobject_class->set_property = vips_object_set_property;
 1005|      1|	gobject_class->get_property = vips_object_get_property;
 1006|       |
 1007|      1|	object_class->nickname = "gifsave_target";
 1008|      1|	object_class->build = vips_foreign_save_cgif_target_build;
 1009|       |
 1010|      1|	VIPS_ARG_OBJECT(class, "target", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
 1011|      1|		_("Target"),
 1012|      1|		_("Target to save to"),
 1013|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1014|      1|		G_STRUCT_OFFSET(VipsForeignSaveCgifTarget, target),
 1015|      1|		VIPS_TYPE_TARGET);
 1016|      1|}
cgifsave.c:vips_foreign_save_cgif_target_build:
  986|  10.9k|{
  987|  10.9k|	VipsForeignSaveCgif *gif = (VipsForeignSaveCgif *) object;
  988|  10.9k|	VipsForeignSaveCgifTarget *target = (VipsForeignSaveCgifTarget *) object;
  989|       |
  990|  10.9k|	gif->target = target->target;
  991|  10.9k|	g_object_ref(gif->target);
  992|       |
  993|  10.9k|	return VIPS_OBJECT_CLASS(vips_foreign_save_cgif_target_parent_class)
  ------------------
  |  |  435|  10.9k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  10.9k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  10.9k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  994|  10.9k|		->build(object);
  995|  10.9k|}
cgifsave.c:vips_foreign_save_cgif_target_init:
 1020|  10.9k|{
 1021|  10.9k|}
cgifsave.c:vips_foreign_save_cgif_file_class_init:
 1048|      1|{
 1049|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1050|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1051|       |
 1052|      1|	gobject_class->set_property = vips_object_set_property;
 1053|      1|	gobject_class->get_property = vips_object_get_property;
 1054|       |
 1055|      1|	object_class->nickname = "gifsave";
 1056|      1|	object_class->build = vips_foreign_save_cgif_file_build;
 1057|       |
 1058|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1059|      1|		_("Filename"),
 1060|      1|		_("Filename to save to"),
 1061|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1062|      1|		G_STRUCT_OFFSET(VipsForeignSaveCgifFile, filename),
 1063|      1|		NULL);
 1064|      1|}
cgifsave.c:vips_foreign_save_cgif_buffer_class_init:
 1107|      1|{
 1108|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1109|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1110|       |
 1111|      1|	gobject_class->set_property = vips_object_set_property;
 1112|      1|	gobject_class->get_property = vips_object_get_property;
 1113|       |
 1114|      1|	object_class->nickname = "gifsave_buffer";
 1115|      1|	object_class->build = vips_foreign_save_cgif_buffer_build;
 1116|       |
 1117|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
 1118|      1|		_("Buffer"),
 1119|      1|		_("Buffer to save to"),
 1120|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
 1121|      1|		G_STRUCT_OFFSET(VipsForeignSaveCgifBuffer, buf),
 1122|      1|		VIPS_TYPE_BLOB);
 1123|      1|}

csvload.c:vips_foreign_load_csv_class_init:
  468|      1|{
  469|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  470|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  471|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  472|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  473|       |
  474|      1|	gobject_class->dispose = vips_foreign_load_csv_dispose;
  475|      1|	gobject_class->set_property = vips_object_set_property;
  476|      1|	gobject_class->get_property = vips_object_get_property;
  477|       |
  478|      1|	object_class->nickname = "csvload_base";
  479|      1|	object_class->description = _("load csv");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  480|      1|	object_class->build = vips_foreign_load_csv_build;
  481|       |
  482|       |	/* This is fuzzed, but you're unlikely to want to use it on
  483|       |	 * untrusted files.
  484|       |	 */
  485|      1|	operation_class->flags |= VIPS_OPERATION_UNTRUSTED;
  486|       |
  487|      1|	load_class->get_flags = vips_foreign_load_csv_get_flags;
  488|      1|	load_class->header = vips_foreign_load_csv_header;
  489|      1|	load_class->load = vips_foreign_load_csv_load;
  490|       |
  491|      1|	VIPS_ARG_INT(class, "skip", 20,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  492|      1|		_("Skip"),
  493|      1|		_("Skip this many lines at the start of the file"),
  494|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  495|      1|		G_STRUCT_OFFSET(VipsForeignLoadCsv, skip),
  496|      1|		0, 10000000, 0);
  497|       |
  498|      1|	VIPS_ARG_INT(class, "lines", 21,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  499|      1|		_("Lines"),
  500|      1|		_("Read this many lines from the file"),
  501|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  502|      1|		G_STRUCT_OFFSET(VipsForeignLoadCsv, lines),
  503|      1|		-1, 10000000, -1);
  504|       |
  505|      1|	VIPS_ARG_STRING(class, "whitespace", 22,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  506|      1|		_("Whitespace"),
  507|      1|		_("Set of whitespace characters"),
  508|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  509|      1|		G_STRUCT_OFFSET(VipsForeignLoadCsv, whitespace),
  510|      1|		" ");
  511|       |
  512|      1|	VIPS_ARG_STRING(class, "separator", 23,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  513|      1|		_("Separator"),
  514|      1|		_("Set of separator characters"),
  515|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  516|      1|		G_STRUCT_OFFSET(VipsForeignLoadCsv, separator),
  517|      1|		";,\t");
  518|      1|}
csvload.c:vips_foreign_load_csv_file_class_init:
  572|      1|{
  573|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  574|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  575|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  576|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  577|       |
  578|      1|	gobject_class->set_property = vips_object_set_property;
  579|      1|	gobject_class->get_property = vips_object_get_property;
  580|       |
  581|      1|	object_class->nickname = "csvload";
  582|      1|	object_class->build = vips_foreign_load_csv_file_build;
  583|       |
  584|      1|	foreign_class->suffs = vips_foreign_load_csv_suffs;
  585|       |
  586|      1|	load_class->get_flags_filename =
  587|      1|		vips_foreign_load_csv_file_get_flags_filename;
  588|       |
  589|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  590|      1|		_("Filename"),
  591|      1|		_("Filename to load from"),
  592|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  593|      1|		G_STRUCT_OFFSET(VipsForeignLoadCsvFile, filename),
  594|      1|		NULL);
  595|      1|}
csvload.c:vips_foreign_load_csv_source_class_init:
  644|      1|{
  645|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  646|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  647|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  648|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  649|       |
  650|      1|	gobject_class->set_property = vips_object_set_property;
  651|      1|	gobject_class->get_property = vips_object_get_property;
  652|       |
  653|      1|	object_class->nickname = "csvload_source";
  654|      1|	object_class->build = vips_foreign_load_csv_source_build;
  655|       |
  656|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  657|       |
  658|      1|	load_class->is_a_source = vips_foreign_load_csv_source_is_a_source;
  659|       |
  660|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  661|      1|		_("Source"),
  662|      1|		_("Source to load from"),
  663|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  664|      1|		G_STRUCT_OFFSET(VipsForeignLoadCsvSource, source),
  665|      1|		VIPS_TYPE_SOURCE);
  666|      1|}

csvsave.c:vips_foreign_save_csv_class_init:
  204|      1|{
  205|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  206|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  207|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  208|      1|	VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
  209|       |
  210|      1|	gobject_class->dispose = vips_foreign_save_csv_dispose;
  211|      1|	gobject_class->set_property = vips_object_set_property;
  212|      1|	gobject_class->get_property = vips_object_get_property;
  213|       |
  214|      1|	object_class->nickname = "csvsave_base";
  215|      1|	object_class->description = _("save image to csv");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  216|      1|	object_class->build = vips_foreign_save_csv_build;
  217|       |
  218|      1|	foreign_class->suffs = vips_foreign_save_csv_suffs;
  219|       |
  220|      1|	save_class->saveable = VIPS_SAVEABLE_MONO;
  221|       |
  222|      1|	VIPS_ARG_STRING(class, "separator", 13,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  223|      1|		_("Separator"),
  224|      1|		_("Separator characters"),
  225|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  226|      1|		G_STRUCT_OFFSET(VipsForeignSaveCsv, separator),
  227|      1|		"\t");
  228|      1|}
csvsave.c:vips_foreign_save_csv_file_class_init:
  263|      1|{
  264|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  265|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  266|       |
  267|      1|	gobject_class->set_property = vips_object_set_property;
  268|      1|	gobject_class->get_property = vips_object_get_property;
  269|       |
  270|      1|	object_class->nickname = "csvsave";
  271|      1|	object_class->build = vips_foreign_save_csv_file_build;
  272|       |
  273|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  274|      1|		_("Filename"),
  275|      1|		_("Filename to save to"),
  276|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  277|      1|		G_STRUCT_OFFSET(VipsForeignSaveCsvFile, filename),
  278|      1|		NULL);
  279|      1|}
csvsave.c:vips_foreign_save_csv_target_class_init:
  314|      1|{
  315|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  316|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  317|       |
  318|      1|	gobject_class->set_property = vips_object_set_property;
  319|      1|	gobject_class->get_property = vips_object_get_property;
  320|       |
  321|      1|	object_class->nickname = "csvsave_target";
  322|      1|	object_class->build = vips_foreign_save_csv_target_build;
  323|       |
  324|      1|	VIPS_ARG_OBJECT(class, "target", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  325|      1|		_("Target"),
  326|      1|		_("Target to save to"),
  327|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  328|      1|		G_STRUCT_OFFSET(VipsForeignSaveCsvTarget, target),
  329|      1|		VIPS_TYPE_TARGET);
  330|      1|}

vips__exif_parse:
  522|  11.9k|{
  523|  11.9k|	const void *data;
  524|  11.9k|	size_t size;
  525|  11.9k|	ExifData *ed;
  526|  11.9k|	VipsExifParams params;
  527|  11.9k|	const char *str;
  528|       |
  529|  11.9k|	if (!vips_image_get_typeof(image, VIPS_META_EXIF_NAME))
  ------------------
  |  |   46|  11.9k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (529:6): [True: 0, False: 11.9k]
  ------------------
  530|      0|		return 0;
  531|  11.9k|	if (vips_image_get_blob(image, VIPS_META_EXIF_NAME, &data, &size))
  ------------------
  |  |   46|  11.9k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (531:6): [True: 0, False: 11.9k]
  ------------------
  532|      0|		return -1;
  533|  11.9k|	if (!(ed = vips_exif_load_data_without_fix(data, size)))
  ------------------
  |  Branch (533:6): [True: 0, False: 11.9k]
  ------------------
  534|      0|		return -1;
  535|       |
  536|       |#ifdef DEBUG_VERBOSE
  537|       |	show_tags(ed);
  538|       |	show_values(ed);
  539|       |#endif /*DEBUG_VERBOSE*/
  540|       |
  541|       |	/* Look for resolution fields and use them to set the VIPS xres/yres
  542|       |	 * fields.
  543|       |	 *
  544|       |	 * If the fields are missing, set them from the image, which will have
  545|       |	 * previously had them set from something like JFIF.
  546|       |	 */
  547|  11.9k|	if (vips_image_resolution_from_exif(image, ed) &&
  ------------------
  |  Branch (547:6): [True: 890, False: 11.0k]
  ------------------
  548|  11.9k|		vips_exif_resolution_from_image(ed, image)) {
  ------------------
  |  Branch (548:3): [True: 0, False: 890]
  ------------------
  549|      0|		exif_data_free(ed);
  550|      0|		return -1;
  551|      0|	}
  552|       |
  553|       |	/* Make sure all required fields are there before we attach the vips
  554|       |	 * metadata.
  555|       |	 */
  556|  11.9k|	exif_data_fix(ed);
  557|       |
  558|       |	/* Attach informational fields for what we find.
  559|       |	 */
  560|  11.9k|	params.image = image;
  561|  11.9k|	params.ed = ed;
  562|  11.9k|	exif_data_foreach_content(ed,
  563|  11.9k|		(ExifDataForeachContentFunc) vips_exif_get_content, &params);
  564|       |
  565|  11.9k|	vips_image_set_blob_copy(image,
  566|  11.9k|		"jpeg-thumbnail-data", ed->data, ed->size);
  567|       |
  568|  11.9k|	exif_data_free(ed);
  569|       |
  570|       |	/* Orientation handling. ifd0 has the Orientation tag for the main
  571|       |	 * image.
  572|       |	 */
  573|  11.9k|	if (vips_image_get_typeof(image, "exif-ifd0-Orientation") != 0 &&
  ------------------
  |  Branch (573:6): [True: 11.2k, False: 682]
  ------------------
  574|  11.9k|		!vips_image_get_string(image,
  ------------------
  |  Branch (574:3): [True: 11.2k, False: 0]
  ------------------
  575|  11.2k|			"exif-ifd0-Orientation", &str)) {
  576|  11.2k|		int orientation;
  577|       |
  578|  11.2k|		orientation = atoi(str);
  579|  11.2k|		if (orientation < 1 ||
  ------------------
  |  Branch (579:7): [True: 33, False: 11.2k]
  ------------------
  580|  11.2k|			orientation > 8)
  ------------------
  |  Branch (580:4): [True: 36, False: 11.1k]
  ------------------
  581|     69|			orientation = 1;
  582|  11.2k|		vips_image_set_int(image, VIPS_META_ORIENTATION, orientation);
  ------------------
  |  |  149|  11.2k|#define VIPS_META_ORIENTATION "orientation"
  ------------------
  583|  11.2k|	}
  584|       |
  585|  11.9k|	return 0;
  586|  11.9k|}
vips__exif_update:
 1428|  10.9k|{
 1429|  10.9k|	unsigned char *data;
 1430|  10.9k|	size_t length;
 1431|  10.9k|	unsigned int idl;
 1432|  10.9k|	ExifData *ed;
 1433|       |
 1434|       |	/* Either parse from the embedded EXIF, or if there's none, make
 1435|       |	 * some fresh EXIF we can write the resolution to.
 1436|       |	 */
 1437|  10.9k|	if (vips_image_get_typeof(image, VIPS_META_EXIF_NAME)) {
  ------------------
  |  |   46|  10.9k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (1437:6): [True: 419, False: 10.5k]
  ------------------
 1438|    419|		if (vips_image_get_blob(image, VIPS_META_EXIF_NAME,
  ------------------
  |  |   46|    419|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (1438:7): [True: 0, False: 419]
  ------------------
 1439|    419|				(void *) &data, &length))
 1440|      0|			return -1;
 1441|       |
 1442|    419|		if (!(ed = vips_exif_load_data_without_fix(data, length)))
  ------------------
  |  Branch (1442:7): [True: 0, False: 419]
  ------------------
 1443|      0|			return -1;
 1444|    419|	}
 1445|  10.5k|	else {
 1446|  10.5k|		ed = exif_data_new();
 1447|       |
 1448|  10.5k|		exif_data_set_option(ed,
 1449|  10.5k|			EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
 1450|  10.5k|		exif_data_set_data_type(ed, EXIF_DATA_TYPE_COMPRESSED);
 1451|  10.5k|		exif_data_set_byte_order(ed, EXIF_BYTE_ORDER_INTEL);
 1452|  10.5k|	}
 1453|       |
 1454|       |	/* Make sure all required fields are there before we attach the vips
 1455|       |	 * metadata.
 1456|       |	 */
 1457|  10.9k|	exif_data_fix(ed);
 1458|       |
 1459|       |	/* Update EXIF tags from the image metadata.
 1460|       |	 */
 1461|  10.9k|	vips_exif_update(ed, image);
 1462|       |
 1463|       |	/* Update EXIF resolution from the vips image header.
 1464|       |	 */
 1465|  10.9k|	if (vips_exif_resolution_from_image(ed, image)) {
  ------------------
  |  Branch (1465:6): [True: 0, False: 10.9k]
  ------------------
 1466|      0|		exif_data_free(ed);
 1467|      0|		return -1;
 1468|      0|	}
 1469|       |
 1470|       |	/* Update EXIF image dimensions from the vips image header.
 1471|       |	 */
 1472|  10.9k|	if (vips_exif_set_dimensions(ed, image)) {
  ------------------
  |  Branch (1472:6): [True: 0, False: 10.9k]
  ------------------
 1473|      0|		exif_data_free(ed);
 1474|      0|		return -1;
 1475|      0|	}
 1476|       |
 1477|       |	/* Update EXIF orientation from the vips image header.
 1478|       |	 */
 1479|  10.9k|	if (vips_exif_set_orientation(ed, image)) {
  ------------------
  |  Branch (1479:6): [True: 0, False: 10.9k]
  ------------------
 1480|      0|		exif_data_free(ed);
 1481|      0|		return -1;
 1482|      0|	}
 1483|       |
 1484|       |	/* Update the thumbnail.
 1485|       |	 */
 1486|  10.9k|	if (vips_exif_set_thumbnail(ed, image)) {
  ------------------
  |  Branch (1486:6): [True: 0, False: 10.9k]
  ------------------
 1487|      0|		exif_data_free(ed);
 1488|      0|		return -1;
 1489|      0|	}
 1490|       |
 1491|       |	/* Reserialise and write. exif_data_save_data() returns an int for some
 1492|       |	 * reason.
 1493|       |	 */
 1494|  10.9k|	exif_data_save_data(ed, &data, &idl);
 1495|  10.9k|	if (!idl) {
  ------------------
  |  Branch (1495:6): [True: 0, False: 10.9k]
  ------------------
 1496|      0|		vips_error("exif", "%s", _("error saving EXIF"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1497|      0|		exif_data_free(ed);
 1498|      0|		return -1;
 1499|      0|	}
 1500|  10.9k|	length = idl;
 1501|       |
 1502|       |#ifdef DEBUG
 1503|       |	printf("vips__exif_update: generated %zd bytes of EXIF\n", length);
 1504|       |#endif /*DEBUG*/
 1505|       |
 1506|  10.9k|	vips_image_set_blob(image, VIPS_META_EXIF_NAME,
  ------------------
  |  |   46|  10.9k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
 1507|  10.9k|		(VipsCallbackFn) vips_area_free_cb, data, length);
 1508|       |
 1509|  10.9k|	exif_data_free(ed);
 1510|       |
 1511|  10.9k|	return 0;
 1512|  10.9k|}
exif.c:vips_exif_load_data_without_fix:
  192|  12.3k|{
  193|  12.3k|	ExifData *ed;
  194|       |
  195|       |	/* exif_data_load_data() only allows uint for length. Limit it to less
  196|       |	 * than that: 2**23 should be enough for anyone.
  197|       |	 */
  198|  12.3k|	if (length < 4) {
  ------------------
  |  Branch (198:6): [True: 0, False: 12.3k]
  ------------------
  199|      0|		vips_error("exif", "%s", _("exif too small"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  200|      0|		return NULL;
  201|      0|	}
  202|  12.3k|	if (length > 1 << 23) {
  ------------------
  |  Branch (202:6): [True: 0, False: 12.3k]
  ------------------
  203|      0|		vips_error("exif", "%s", _("exif too large"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  204|      0|		return NULL;
  205|      0|	}
  206|       |
  207|  12.3k|	if (!(ed = exif_data_new())) {
  ------------------
  |  Branch (207:6): [True: 0, False: 12.3k]
  ------------------
  208|      0|		vips_error("exif", "%s", _("unable to init exif"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  209|      0|		return NULL;
  210|      0|	}
  211|       |
  212|  12.3k|	exif_data_unset_option(ed, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
  213|  12.3k|	if (!vips_isprefix("Exif", (char *) data)) {
  ------------------
  |  Branch (213:6): [True: 0, False: 12.3k]
  ------------------
  214|       |		/* Ensure "Exif" prefix as loaders may not provide it.
  215|       |		 */
  216|      0|		void *data_with_prefix;
  217|      0|		data_with_prefix = g_malloc0(length + 6);
  218|      0|		memcpy(data_with_prefix, "Exif\0\0", 6);
  219|      0|		memcpy((char *) data_with_prefix + 6, data, length);
  220|      0|		exif_data_load_data(ed, data_with_prefix, length + 6);
  221|      0|		g_free(data_with_prefix);
  222|      0|	}
  223|  12.3k|	else
  224|  12.3k|		exif_data_load_data(ed, data, length);
  225|       |
  226|  12.3k|	return ed;
  227|  12.3k|}
exif.c:vips_image_resolution_from_exif:
  442|  11.9k|{
  443|  11.9k|	double xres, yres;
  444|  11.9k|	int unit;
  445|       |
  446|       |	/* The main image xres/yres are in ifd0. ifd1 has xres/yres of the
  447|       |	 * image thumbnail, if any.
  448|       |	 *
  449|       |	 * Don't warn about missing res fields, it's very common, especially for
  450|       |	 * things like webp.
  451|       |	 */
  452|  11.9k|	if (vips_exif_entry_get_double(ed, 0, EXIF_TAG_X_RESOLUTION, &xres) ||
  ------------------
  |  Branch (452:6): [True: 666, False: 11.2k]
  ------------------
  453|  11.9k|		vips_exif_entry_get_double(ed,
  ------------------
  |  Branch (453:3): [True: 174, False: 11.0k]
  ------------------
  454|  11.2k|			0, EXIF_TAG_Y_RESOLUTION, &yres))
  455|    840|		return -1;
  456|       |
  457|       |	/* resuint is optional and defaults to inch.
  458|       |	 */
  459|  11.0k|	unit = 2;
  460|  11.0k|	(void) vips_exif_entry_get_int(ed,
  461|  11.0k|		0, EXIF_TAG_RESOLUTION_UNIT, &unit);
  462|       |
  463|       |#ifdef DEBUG
  464|       |	printf("vips_image_resolution_from_exif: seen exif tags "
  465|       |		   "xres = %g, yres = %g, unit = %d\n",
  466|       |		xres, yres, unit);
  467|       |#endif /*DEBUG*/
  468|       |
  469|  11.0k|	switch (unit) {
  470|      9|	case 1:
  ------------------
  |  Branch (470:2): [True: 9, False: 11.0k]
  ------------------
  471|       |		/* No units, instead xres / yres gives the pixel aspect ratio.
  472|       |		 */
  473|      9|		break;
  474|       |
  475|  10.6k|	case 2:
  ------------------
  |  Branch (475:2): [True: 10.6k, False: 461]
  ------------------
  476|       |		/* In inches.
  477|       |		 */
  478|  10.6k|		xres /= 25.4;
  479|  10.6k|		yres /= 25.4;
  480|  10.6k|		vips_image_set_string(image,
  481|  10.6k|			VIPS_META_RESOLUTION_UNIT, "in");
  ------------------
  |  |   93|  10.6k|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  482|  10.6k|		break;
  483|       |
  484|    402|	case 3:
  ------------------
  |  Branch (484:2): [True: 402, False: 10.6k]
  ------------------
  485|       |		/* In cm.
  486|       |		 */
  487|    402|		xres /= 10.0;
  488|    402|		yres /= 10.0;
  489|    402|		vips_image_set_string(image,
  490|    402|			VIPS_META_RESOLUTION_UNIT, "cm");
  ------------------
  |  |   93|    402|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  491|    402|		break;
  492|       |
  493|     50|	default:
  ------------------
  |  Branch (493:2): [True: 50, False: 11.0k]
  ------------------
  494|     50|		g_warning("%s", _("unknown EXIF resolution unit"));
  ------------------
  |  |  338|     50|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|     50|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|     50|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|     50|                               __VA_ARGS__)
  ------------------
  495|     50|		return -1;
  496|  11.0k|	}
  497|       |
  498|       |#ifdef DEBUG
  499|       |	printf("vips_image_resolution_from_exif: "
  500|       |		   "seen exif resolution %g, %g p/mm\n",
  501|       |		xres, yres);
  502|       |#endif /*DEBUG*/
  503|       |
  504|       |	/* Don't allow negative resolution.
  505|       |	 */
  506|  11.0k|	image->Xres = VIPS_MAX(0, xres);
  ------------------
  |  |   54|  11.0k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 11.0k]
  |  |  ------------------
  ------------------
  507|  11.0k|	image->Yres = VIPS_MAX(0, yres);
  ------------------
  |  |   54|  11.0k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 11.0k]
  |  |  ------------------
  ------------------
  508|       |
  509|  11.0k|	return 0;
  510|  11.0k|}
exif.c:vips_exif_entry_get_double:
  416|  23.2k|{
  417|  23.2k|	ExifEntry *entry;
  418|       |
  419|  23.2k|	if (!(entry = exif_content_get_entry(ed->ifd[ifd], tag)) ||
  ------------------
  |  Branch (419:6): [True: 746, False: 22.4k]
  ------------------
  420|  23.2k|		entry->components != 1)
  ------------------
  |  Branch (420:3): [True: 91, False: 22.3k]
  ------------------
  421|    837|		return -1;
  422|       |
  423|  22.3k|	return vips_exif_get_double(ed, entry, 0, out);
  424|  23.2k|}
exif.c:vips_exif_get_double:
  290|  22.3k|{
  291|  22.3k|	ExifRational rv;
  292|  22.3k|	ExifSRational srv;
  293|  22.3k|	double value;
  294|       |
  295|  22.3k|	if (!vips_exif_get_rational(ed, entry, component, &rv)) {
  ------------------
  |  Branch (295:6): [True: 22.3k, False: 9]
  ------------------
  296|  22.3k|		if (rv.denominator == 0)
  ------------------
  |  Branch (296:7): [True: 132, False: 22.2k]
  ------------------
  297|    132|			value = 0;
  298|  22.2k|		else
  299|  22.2k|			value = (double) rv.numerator / rv.denominator;
  300|  22.3k|	}
  301|      9|	else if (!vips_exif_get_srational(ed, entry, component, &srv)) {
  ------------------
  |  Branch (301:11): [True: 6, False: 3]
  ------------------
  302|      6|		if (srv.denominator == 0)
  ------------------
  |  Branch (302:7): [True: 2, False: 4]
  ------------------
  303|      2|			value = 0;
  304|      4|		else
  305|      4|			value = (double) srv.numerator / srv.denominator;
  306|      6|	}
  307|      3|	else
  308|      3|		return -1;
  309|       |
  310|  22.3k|	*out = value;
  311|       |
  312|  22.3k|	return 0;
  313|  22.3k|}
exif.c:vips_exif_get_rational:
  256|   115k|{
  257|   115k|	if (entry->format == EXIF_FORMAT_RATIONAL) {
  ------------------
  |  Branch (257:6): [True: 77.5k, False: 38.1k]
  ------------------
  258|  77.5k|		ExifByteOrder bo = exif_data_get_byte_order(ed);
  259|  77.5k|		size_t sizeof_component = entry->size / entry->components;
  260|  77.5k|		size_t offset = component * sizeof_component;
  261|       |
  262|  77.5k|		*out = exif_get_rational(entry->data + offset, bo);
  263|  77.5k|	}
  264|  38.1k|	else
  265|  38.1k|		return -1;
  266|       |
  267|  77.5k|	return 0;
  268|   115k|}
exif.c:vips_exif_get_srational:
  273|  39.6k|{
  274|  39.6k|	if (entry->format == EXIF_FORMAT_SRATIONAL) {
  ------------------
  |  Branch (274:6): [True: 2.29k, False: 37.3k]
  ------------------
  275|  2.29k|		ExifByteOrder bo = exif_data_get_byte_order(ed);
  276|  2.29k|		size_t sizeof_component = entry->size / entry->components;
  277|  2.29k|		size_t offset = component * sizeof_component;
  278|       |
  279|  2.29k|		*out = exif_get_srational(entry->data + offset, bo);
  280|  2.29k|	}
  281|  37.3k|	else
  282|  37.3k|		return -1;
  283|       |
  284|  2.29k|	return 0;
  285|  39.6k|}
exif.c:vips_exif_entry_get_int:
  428|  11.0k|{
  429|  11.0k|	ExifEntry *entry;
  430|       |
  431|  11.0k|	if (!(entry = exif_content_get_entry(ed->ifd[ifd], tag)) ||
  ------------------
  |  Branch (431:6): [True: 47, False: 11.0k]
  ------------------
  432|  11.0k|		entry->components != 1)
  ------------------
  |  Branch (432:3): [True: 39, False: 11.0k]
  ------------------
  433|     86|		return -1;
  434|       |
  435|  11.0k|	return vips_exif_get_int(ed, entry, 0, out);
  436|  11.0k|}
exif.c:vips_exif_get_int:
  232|   225k|{
  233|   225k|	ExifByteOrder bo = exif_data_get_byte_order(ed);
  234|   225k|	size_t sizeof_component = entry->size / entry->components;
  235|   225k|	size_t offset = component * sizeof_component;
  236|       |
  237|   225k|	if (entry->format == EXIF_FORMAT_SHORT)
  ------------------
  |  Branch (237:6): [True: 114k, False: 111k]
  ------------------
  238|   114k|		*out = exif_get_short(entry->data + offset, bo);
  239|   111k|	else if (entry->format == EXIF_FORMAT_SSHORT)
  ------------------
  |  Branch (239:11): [True: 177, False: 111k]
  ------------------
  240|    177|		*out = exif_get_sshort(entry->data + offset, bo);
  241|   111k|	else if (entry->format == EXIF_FORMAT_LONG)
  ------------------
  |  Branch (241:11): [True: 45.1k, False: 66.1k]
  ------------------
  242|       |		/* This won't work for huge values, but who cares.
  243|       |		 */
  244|  45.1k|		*out = (int) exif_get_long(entry->data + offset, bo);
  245|  66.1k|	else if (entry->format == EXIF_FORMAT_SLONG)
  ------------------
  |  Branch (245:11): [True: 1.19k, False: 64.9k]
  ------------------
  246|  1.19k|		*out = exif_get_slong(entry->data + offset, bo);
  247|  64.9k|	else
  248|  64.9k|		return -1;
  249|       |
  250|   160k|	return 0;
  251|   225k|}
exif.c:vips_exif_get_content:
  409|  59.6k|{
  410|  59.6k|	exif_content_foreach_entry(content,
  411|  59.6k|		(ExifContentForeachEntryFunc) vips_exif_attach_entry, params);
  412|  59.6k|}
exif.c:vips_exif_attach_entry:
  385|   144k|{
  386|   144k|	const char *tag_name;
  387|   144k|	char vips_name_txt[256];
  388|   144k|	VipsBuf vips_name = VIPS_BUF_STATIC(vips_name_txt);
  ------------------
  |  |   60|   144k|	{ \
  |  |   61|   144k|		&TEXT[0], sizeof(TEXT), 0, FALSE, 0, FALSE \
  |  |  ------------------
  |  |  |  |  794|   144k|#define	FALSE	(0)
  |  |  ------------------
  |  |               		&TEXT[0], sizeof(TEXT), 0, FALSE, 0, FALSE \
  |  |  ------------------
  |  |  |  |  794|   144k|#define	FALSE	(0)
  |  |  ------------------
  |  |   62|   144k|	}
  ------------------
  389|   144k|	VipsDbuf value = { 0 };
  390|       |
  391|   144k|	if (!(tag_name = vips_exif_entry_get_name(entry)))
  ------------------
  |  Branch (391:6): [True: 0, False: 144k]
  ------------------
  392|      0|		return;
  393|       |
  394|   144k|	vips_buf_appendf(&vips_name, "exif-ifd%d-%s",
  395|   144k|		exif_entry_get_ifd(entry), tag_name);
  ------------------
  |  |  182|   144k|#define exif_entry_get_ifd(e) ((e)?exif_content_get_ifd((e)->parent):EXIF_IFD_COUNT)
  |  |  ------------------
  |  |  |  Branch (182:32): [True: 144k, False: 0]
  |  |  ------------------
  ------------------
  396|   144k|	vips_exif_to_s(params->ed, entry, &value);
  397|       |
  398|       |	/* Can't do anything sensible with the error return.
  399|       |	 */
  400|   144k|	(void) vips_image_set_string(params->image,
  401|   144k|		vips_buf_all(&vips_name),
  402|   144k|		(char *) vips_dbuf_string(&value, NULL));
  403|       |
  404|   144k|	vips_dbuf_destroy(&value);
  405|   144k|}
exif.c:vips_exif_entry_get_name:
  375|   152k|{
  376|   152k|	if (!entry->parent)
  ------------------
  |  Branch (376:6): [True: 0, False: 152k]
  ------------------
  377|      0|		return NULL;
  378|       |
  379|   152k|	return exif_tag_get_name_in_ifd(entry->tag,
  380|   152k|		exif_entry_get_ifd(entry));
  ------------------
  |  |  182|   152k|#define exif_entry_get_ifd(e) ((e)?exif_content_get_ifd((e)->parent):EXIF_IFD_COUNT)
  |  |  ------------------
  |  |  |  Branch (182:32): [True: 152k, False: 0]
  |  |  ------------------
  ------------------
  381|   152k|}
exif.c:vips_exif_to_s:
  322|   145k|{
  323|   145k|	char *text = entry_to_s(entry);
  324|       |
  325|   145k|	unsigned long i;
  326|   145k|	int iv;
  327|   145k|	ExifRational rv;
  328|   145k|	ExifSRational srv;
  329|       |
  330|   145k|	if (entry->components < 10 &&
  ------------------
  |  Branch (330:6): [True: 139k, False: 6.20k]
  ------------------
  331|   145k|		!vips_exif_get_int(ed, entry, 0, &iv)) {
  ------------------
  |  Branch (331:3): [True: 74.4k, False: 64.9k]
  ------------------
  332|   149k|		for (i = 0; i < entry->components; i++) {
  ------------------
  |  Branch (332:15): [True: 75.3k, False: 74.4k]
  ------------------
  333|  75.3k|			vips_exif_get_int(ed, entry, i, &iv);
  334|  75.3k|			vips_dbuf_writef(buf, "%d ", iv);
  335|  75.3k|		}
  336|  74.4k|	}
  337|  71.1k|	else if (entry->components < 10 &&
  ------------------
  |  Branch (337:11): [True: 64.9k, False: 6.20k]
  ------------------
  338|  71.1k|		!vips_exif_get_rational(ed, entry, 0, &rv)) {
  ------------------
  |  Branch (338:3): [True: 26.8k, False: 38.0k]
  ------------------
  339|  55.1k|		for (i = 0; i < entry->components; i++) {
  ------------------
  |  Branch (339:15): [True: 28.3k, False: 26.8k]
  ------------------
  340|  28.3k|			vips_exif_get_rational(ed, entry, i, &rv);
  341|  28.3k|			vips_dbuf_writef(buf, "%u/%u ", rv.numerator, rv.denominator);
  342|  28.3k|		}
  343|  26.8k|	}
  344|  44.3k|	else if (entry->components < 10 &&
  ------------------
  |  Branch (344:11): [True: 38.0k, False: 6.20k]
  ------------------
  345|  44.3k|		!vips_exif_get_srational(ed, entry, 0, &srv)) {
  ------------------
  |  Branch (345:3): [True: 774, False: 37.3k]
  ------------------
  346|  2.29k|		for (i = 0; i < entry->components; i++) {
  ------------------
  |  Branch (346:15): [True: 1.51k, False: 774]
  ------------------
  347|  1.51k|			vips_exif_get_srational(ed, entry, i, &srv);
  348|  1.51k|			vips_dbuf_writef(buf, "%d/%d ", srv.numerator, srv.denominator);
  349|  1.51k|		}
  350|    774|	}
  351|  43.5k|	else
  352|  43.5k|		vips_dbuf_writef(buf, "%s ", text);
  353|       |
  354|   145k|	vips_dbuf_writef(buf, "(%s, %s, %lu components, %d bytes)",
  355|   145k|		text,
  356|   145k|		exif_format_get_name(entry->format),
  357|   145k|		entry->components,
  358|   145k|		entry->size);
  359|       |
  360|   145k|	g_free(text);
  361|   145k|}
exif.c:entry_to_s:
   84|   145k|{
   85|       |	/* Some extra space for conversion to string ... this can be quite a bit
   86|       |	 * for formats like float. Ban crazy size values.
   87|       |	 */
   88|   145k|	int size = VIPS_MIN(entry->size, 10000);
  ------------------
  |  |   55|   145k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 145k, False: 543]
  |  |  ------------------
  ------------------
   89|   145k|	int max_size = size * 3 + 32;
   90|   145k|	char *text = VIPS_MALLOC(NULL, max_size + 1);
  ------------------
  |  |   68|   145k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  ------------------
  |  |  |  |  433|   145k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|   145k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|   145k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   91|       |
   92|       |	// this renders floats as eg. "12.2345", enums as "Inch", etc.
   93|   145k|	exif_entry_get_value(entry, text, max_size);
   94|       |
   95|       |	// libexif does not null-terminate ASCII strings, we must add the \0
   96|       |	// ourselves
   97|   145k|	if (entry->format == EXIF_FORMAT_ASCII)
  ------------------
  |  Branch (97:6): [True: 4.90k, False: 140k]
  ------------------
   98|  4.90k|		text[size] = '\0';
   99|       |
  100|   145k|	char *utf8 = g_utf8_make_valid(text, -1);
  101|       |
  102|   145k|	g_free(text);
  103|       |
  104|   145k|	return utf8;
  105|   145k|}
exif.c:vips_exif_resolution_from_image:
 1032|  11.8k|{
 1033|  11.8k|	double xres, yres;
 1034|  11.8k|	const char *p;
 1035|  11.8k|	int unit;
 1036|       |
 1037|  11.8k|	VIPS_DEBUG_MSG("vips_exif_resolution_from_image: vips res of %g, %g\n",
  ------------------
  |  |   47|  11.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  11.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  11.8k|	{ \
  |  |   49|  11.8k|		; \
  |  |   50|  11.8k|	} \
  |  |   51|  11.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  11.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1038|  11.8k|		image->Xres, image->Yres);
 1039|       |
 1040|       |	/* Default to inches, more progs support it.
 1041|       |	 */
 1042|  11.8k|	unit = 2;
 1043|  11.8k|	if (vips_image_get_typeof(image, VIPS_META_RESOLUTION_UNIT) &&
  ------------------
  |  |   93|  11.8k|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  |  Branch (1043:6): [True: 685, False: 11.1k]
  ------------------
 1044|  11.8k|		!vips_image_get_string(image,
  ------------------
  |  Branch (1044:3): [True: 685, False: 0]
  ------------------
 1045|    685|			VIPS_META_RESOLUTION_UNIT, &p)) {
  ------------------
  |  |   93|    685|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
 1046|    685|		if (vips_isprefix("cm", p))
  ------------------
  |  Branch (1046:7): [True: 396, False: 289]
  ------------------
 1047|    396|			unit = 3;
 1048|    289|		else if (vips_isprefix("none", p))
  ------------------
  |  Branch (1048:12): [True: 0, False: 289]
  ------------------
 1049|      0|			unit = 1;
 1050|    685|	}
 1051|       |
 1052|  11.8k|	switch (unit) {
 1053|      0|	case 1:
  ------------------
  |  Branch (1053:2): [True: 0, False: 11.8k]
  ------------------
 1054|      0|		xres = image->Xres;
 1055|      0|		yres = image->Yres;
 1056|      0|		break;
 1057|       |
 1058|  11.4k|	case 2:
  ------------------
  |  Branch (1058:2): [True: 11.4k, False: 396]
  ------------------
 1059|  11.4k|		xres = image->Xres * 25.4;
 1060|  11.4k|		yres = image->Yres * 25.4;
 1061|  11.4k|		break;
 1062|       |
 1063|    396|	case 3:
  ------------------
  |  Branch (1063:2): [True: 396, False: 11.4k]
  ------------------
 1064|    396|		xres = image->Xres * 10.0;
 1065|    396|		yres = image->Yres * 10.0;
 1066|    396|		break;
 1067|       |
 1068|      0|	default:
  ------------------
  |  Branch (1068:2): [True: 0, False: 11.8k]
  ------------------
 1069|      0|		g_warning("%s", _("unknown EXIF resolution unit"));
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1070|      0|		return 0;
 1071|  11.8k|	}
 1072|       |
 1073|       |	/* Main image xres/yres/unit are in ifd0. ifd1 has the thumbnail
 1074|       |	 * xres/yres/unit.
 1075|       |	 */
 1076|  11.8k|	vips_exif_set_tag(ed, 0, EXIF_TAG_X_RESOLUTION,
 1077|  11.8k|		vips_exif_set_double, (void *) &xres);
 1078|  11.8k|	vips_exif_set_tag(ed, 0, EXIF_TAG_Y_RESOLUTION,
 1079|  11.8k|		vips_exif_set_double, (void *) &yres);
 1080|  11.8k|	vips_exif_set_tag(ed, 0, EXIF_TAG_RESOLUTION_UNIT,
 1081|  11.8k|		vips_exif_set_int, (void *) &unit);
 1082|       |
 1083|  11.8k|	return 0;
 1084|  11.8k|}
exif.c:vips_exif_set_tag:
  997|  76.7k|{
  998|  76.7k|	ExifEntry *entry;
  999|       |
 1000|  76.7k|	if ((entry = exif_content_get_entry(ed->ifd[ifd], tag))) {
  ------------------
  |  Branch (1000:6): [True: 63.2k, False: 13.5k]
  ------------------
 1001|  63.2k|		fn(ed, entry, 0, data);
 1002|  63.2k|	}
 1003|  13.5k|	else {
 1004|  13.5k|		entry = exif_entry_new();
 1005|       |
 1006|       |		/* tag must be set before calling exif_content_add_entry.
 1007|       |		 */
 1008|  13.5k|		entry->tag = tag;
 1009|  13.5k|		exif_content_add_entry(ed->ifd[ifd], entry);
 1010|  13.5k|		exif_entry_unref(entry);
 1011|       |
 1012|       |		/* libexif makes us have a special path for string-valued
 1013|       |		 * fields :(
 1014|       |		 */
 1015|  13.5k|		if (tag_is_encoding(tag))
  ------------------
  |  Branch (1015:7): [True: 0, False: 13.5k]
  ------------------
 1016|      0|			vips_exif_set_string_encoding(ed, entry, 0, data);
 1017|  13.5k|		else if (tag_is_ascii(tag))
  ------------------
  |  Branch (1017:12): [True: 0, False: 13.5k]
  ------------------
 1018|      0|			vips_exif_set_string_ascii(ed, entry, 0, data);
 1019|  13.5k|		else if (tag_is_utf16(tag))
  ------------------
  |  Branch (1019:12): [True: 0, False: 13.5k]
  ------------------
 1020|      0|			vips_exif_set_string_utf16(ed, entry, 0, data);
 1021|  13.5k|		else {
 1022|  13.5k|			exif_entry_initialize(entry, tag);
 1023|  13.5k|			fn(ed, entry, 0, data);
 1024|  13.5k|		}
 1025|  13.5k|	}
 1026|  76.7k|}
exif.c:tag_is_encoding:
  796|  22.1k|{
  797|  22.1k|	return tag == EXIF_TAG_USER_COMMENT;
  798|  22.1k|}
exif.c:tag_is_ascii:
  802|  22.1k|{
  803|  22.1k|	return tag == EXIF_TAG_MAKE ||
  ------------------
  |  Branch (803:9): [True: 136, False: 22.0k]
  ------------------
  804|  22.1k|		tag == EXIF_TAG_MODEL ||
  ------------------
  |  Branch (804:3): [True: 155, False: 21.8k]
  ------------------
  805|  22.1k|		tag == EXIF_TAG_IMAGE_DESCRIPTION ||
  ------------------
  |  Branch (805:3): [True: 10, False: 21.8k]
  ------------------
  806|  22.1k|		tag == EXIF_TAG_ARTIST ||
  ------------------
  |  Branch (806:3): [True: 41, False: 21.7k]
  ------------------
  807|  22.1k|		tag == EXIF_TAG_SOFTWARE ||
  ------------------
  |  Branch (807:3): [True: 142, False: 21.6k]
  ------------------
  808|  22.1k|		tag == EXIF_TAG_COPYRIGHT ||
  ------------------
  |  Branch (808:3): [True: 66, False: 21.5k]
  ------------------
  809|  22.1k|		tag == EXIF_TAG_DATE_TIME ||
  ------------------
  |  Branch (809:3): [True: 129, False: 21.4k]
  ------------------
  810|  22.1k|		tag == EXIF_TAG_DATE_TIME_ORIGINAL ||
  ------------------
  |  Branch (810:3): [True: 124, False: 21.3k]
  ------------------
  811|  22.1k|		tag == EXIF_TAG_DATE_TIME_DIGITIZED ||
  ------------------
  |  Branch (811:3): [True: 70, False: 21.2k]
  ------------------
  812|  22.1k|		tag == EXIF_TAG_SUB_SEC_TIME ||
  ------------------
  |  Branch (812:3): [True: 0, False: 21.2k]
  ------------------
  813|  22.1k|		tag == EXIF_TAG_SUB_SEC_TIME_ORIGINAL ||
  ------------------
  |  Branch (813:3): [True: 27, False: 21.2k]
  ------------------
  814|  22.1k|		tag == EXIF_TAG_SUB_SEC_TIME_DIGITIZED
  ------------------
  |  Branch (814:3): [True: 5, False: 21.2k]
  ------------------
  815|  22.1k|#ifdef HAVE_EXIF_0_6_22
  816|  22.1k|		|| tag == EXIF_TAG_CAMERA_OWNER_NAME ||
  ------------------
  |  Branch (816:6): [True: 21, False: 21.2k]
  ------------------
  817|  22.1k|		tag == EXIF_TAG_BODY_SERIAL_NUMBER ||
  ------------------
  |  Branch (817:3): [True: 13, False: 21.2k]
  ------------------
  818|  22.1k|		tag == EXIF_TAG_LENS_MAKE ||
  ------------------
  |  Branch (818:3): [True: 15, False: 21.1k]
  ------------------
  819|  22.1k|		tag == EXIF_TAG_LENS_MODEL ||
  ------------------
  |  Branch (819:3): [True: 0, False: 21.1k]
  ------------------
  820|  22.1k|		tag == EXIF_TAG_LENS_SERIAL_NUMBER
  ------------------
  |  Branch (820:3): [True: 0, False: 21.1k]
  ------------------
  821|  22.1k|#endif
  822|  22.1k|#ifdef HAVE_EXIF_0_6_23
  823|  22.1k|		|| tag == EXIF_TAG_OFFSET_TIME ||
  ------------------
  |  Branch (823:6): [True: 0, False: 21.1k]
  ------------------
  824|  22.1k|		tag == EXIF_TAG_OFFSET_TIME_ORIGINAL ||
  ------------------
  |  Branch (824:3): [True: 0, False: 21.1k]
  ------------------
  825|  22.1k|		tag == EXIF_TAG_OFFSET_TIME_DIGITIZED ||
  ------------------
  |  Branch (825:3): [True: 0, False: 21.1k]
  ------------------
  826|  22.1k|		tag == EXIF_TAG_GPS_LATITUDE_REF ||
  ------------------
  |  |  177|  43.3k|#define EXIF_TAG_GPS_LATITUDE_REF      0x0001 /* INTEROPERABILITY_INDEX   */
  ------------------
  |  Branch (826:3): [True: 113, False: 21.0k]
  ------------------
  827|  22.1k|		tag == EXIF_TAG_GPS_LONGITUDE_REF ||
  ------------------
  |  |  179|  43.2k|#define EXIF_TAG_GPS_LONGITUDE_REF     0x0003
  ------------------
  |  Branch (827:3): [True: 21, False: 21.0k]
  ------------------
  828|  22.1k|		tag == EXIF_TAG_GPS_SATELLITES ||
  ------------------
  |  |  184|  43.1k|#define EXIF_TAG_GPS_SATELLITES        0x0008
  ------------------
  |  Branch (828:3): [True: 17, False: 21.0k]
  ------------------
  829|  22.1k|		tag == EXIF_TAG_GPS_STATUS ||
  ------------------
  |  |  185|  43.1k|#define EXIF_TAG_GPS_STATUS            0x0009
  ------------------
  |  Branch (829:3): [True: 14, False: 21.0k]
  ------------------
  830|  22.1k|		tag == EXIF_TAG_GPS_MEASURE_MODE ||
  ------------------
  |  |  186|  43.1k|#define EXIF_TAG_GPS_MEASURE_MODE      0x000a
  ------------------
  |  Branch (830:3): [True: 10, False: 21.0k]
  ------------------
  831|  22.1k|		tag == EXIF_TAG_GPS_SPEED_REF ||
  ------------------
  |  |  188|  43.1k|#define EXIF_TAG_GPS_SPEED_REF         0x000c
  ------------------
  |  Branch (831:3): [True: 15, False: 20.9k]
  ------------------
  832|  22.1k|		tag == EXIF_TAG_GPS_TRACK_REF ||
  ------------------
  |  |  190|  43.1k|#define EXIF_TAG_GPS_TRACK_REF         0x000e
  ------------------
  |  Branch (832:3): [True: 0, False: 20.9k]
  ------------------
  833|  22.1k|		tag == EXIF_TAG_GPS_IMG_DIRECTION_REF ||
  ------------------
  |  |  192|  43.1k|#define EXIF_TAG_GPS_IMG_DIRECTION_REF 0x0010
  ------------------
  |  Branch (833:3): [True: 12, False: 20.9k]
  ------------------
  834|  22.1k|		tag == EXIF_TAG_GPS_MAP_DATUM ||
  ------------------
  |  |  194|  43.1k|#define EXIF_TAG_GPS_MAP_DATUM         0x0012
  ------------------
  |  Branch (834:3): [True: 0, False: 20.9k]
  ------------------
  835|  22.1k|		tag == EXIF_TAG_GPS_DEST_LATITUDE_REF ||
  ------------------
  |  |  195|  43.1k|#define EXIF_TAG_GPS_DEST_LATITUDE_REF 0x0013
  ------------------
  |  Branch (835:3): [True: 0, False: 20.9k]
  ------------------
  836|  22.1k|		tag == EXIF_TAG_GPS_DEST_LONGITUDE_REF ||
  ------------------
  |  |  197|  43.1k|#define EXIF_TAG_GPS_DEST_LONGITUDE_REF 0x0015
  ------------------
  |  Branch (836:3): [True: 0, False: 20.9k]
  ------------------
  837|  22.1k|		tag == EXIF_TAG_GPS_DEST_BEARING_REF ||
  ------------------
  |  |  199|  43.1k|#define EXIF_TAG_GPS_DEST_BEARING_REF   0x0017
  ------------------
  |  Branch (837:3): [True: 0, False: 20.9k]
  ------------------
  838|  22.1k|		tag == EXIF_TAG_GPS_DEST_DISTANCE_REF ||
  ------------------
  |  |  201|  43.1k|#define EXIF_TAG_GPS_DEST_DISTANCE_REF  0x0019
  ------------------
  |  Branch (838:3): [True: 2, False: 20.9k]
  ------------------
  839|  22.1k|		tag == EXIF_TAG_GPS_DATE_STAMP
  ------------------
  |  |  205|  20.9k|#define EXIF_TAG_GPS_DATE_STAMP         0x001d
  ------------------
  |  Branch (839:3): [True: 0, False: 20.9k]
  ------------------
  840|  22.1k|#endif
  841|  22.1k|		;
  842|  22.1k|}
exif.c:tag_is_utf16:
  846|  20.9k|{
  847|  20.9k|	return tag == EXIF_TAG_XP_TITLE ||
  ------------------
  |  Branch (847:9): [True: 1, False: 20.9k]
  ------------------
  848|  20.9k|		tag == EXIF_TAG_XP_COMMENT ||
  ------------------
  |  Branch (848:3): [True: 0, False: 20.9k]
  ------------------
  849|  20.9k|		tag == EXIF_TAG_XP_AUTHOR ||
  ------------------
  |  Branch (849:3): [True: 0, False: 20.9k]
  ------------------
  850|  20.9k|		tag == EXIF_TAG_XP_KEYWORDS ||
  ------------------
  |  Branch (850:3): [True: 0, False: 20.9k]
  ------------------
  851|  20.9k|		tag == EXIF_TAG_XP_SUBJECT;
  ------------------
  |  Branch (851:3): [True: 0, False: 20.9k]
  ------------------
  852|  20.9k|}
exif.c:vips_exif_set_double:
  720|  23.6k|{
  721|  23.6k|	double value = *((double *) data);
  722|       |
  723|  23.6k|	ExifByteOrder bo;
  724|  23.6k|	size_t sizeof_component;
  725|  23.6k|	size_t offset;
  726|  23.6k|	double old_value;
  727|       |
  728|  23.6k|	if (entry->components <= component) {
  ------------------
  |  Branch (728:6): [True: 0, False: 23.6k]
  ------------------
  729|      0|		VIPS_DEBUG_MSG("vips_exif_set_double: too few components\n");
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  730|      0|		return;
  731|      0|	}
  732|       |
  733|       |	/* Wait until after the component check to make sure we can't get /0.
  734|       |	 */
  735|  23.6k|	bo = exif_data_get_byte_order(ed);
  736|  23.6k|	sizeof_component = entry->size / entry->components;
  737|  23.6k|	offset = component * sizeof_component;
  738|       |
  739|  23.6k|	VIPS_DEBUG_MSG("vips_exif_set_double: %s = %g\n",
  ------------------
  |  |   47|  23.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  23.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  23.6k|	{ \
  |  |   49|  23.6k|		; \
  |  |   50|  23.6k|	} \
  |  |   51|  23.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  23.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  740|  23.6k|		vips_exif_entry_get_name(entry), value);
  741|       |
  742|  23.6k|	if (entry->format == EXIF_FORMAT_RATIONAL) {
  ------------------
  |  Branch (742:6): [True: 23.6k, False: 17]
  ------------------
  743|  23.6k|		ExifRational rv;
  744|       |
  745|  23.6k|		rv = exif_get_rational(entry->data + offset, bo);
  746|  23.6k|		if (rv.denominator == 0)
  ------------------
  |  Branch (746:7): [True: 101, False: 23.5k]
  ------------------
  747|    101|			old_value = 0;
  748|  23.5k|		else
  749|  23.5k|			old_value = (double) rv.numerator / rv.denominator;
  750|       |
  751|  23.6k|		if (VIPS_FABS(old_value - value) > 0.0001) {
  ------------------
  |  |   76|  23.6k|#define VIPS_FABS(V) __builtin_fabs(V)
  ------------------
  |  Branch (751:7): [True: 18.0k, False: 5.51k]
  ------------------
  752|  18.0k|			vips_exif_double_to_rational(value, &rv);
  753|       |
  754|  18.0k|			VIPS_DEBUG_MSG("vips_exif_set_double: %u / %u\n",
  ------------------
  |  |   47|  18.0k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  18.0k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  18.0k|	{ \
  |  |   49|  18.0k|		; \
  |  |   50|  18.0k|	} \
  |  |   51|  18.0k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  18.0k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  755|  18.0k|				rv.numerator,
  756|  18.0k|				rv.denominator);
  757|       |
  758|  18.0k|			exif_set_rational(entry->data + offset, bo, rv);
  759|  18.0k|		}
  760|  23.6k|	}
  761|     17|	else if (entry->format == EXIF_FORMAT_SRATIONAL) {
  ------------------
  |  Branch (761:11): [True: 6, False: 11]
  ------------------
  762|      6|		ExifSRational srv;
  763|       |
  764|      6|		srv = exif_get_srational(entry->data + offset, bo);
  765|      6|		if (srv.denominator == 0)
  ------------------
  |  Branch (765:7): [True: 2, False: 4]
  ------------------
  766|      2|			old_value = 0;
  767|      4|		else
  768|      4|			old_value = (double) srv.numerator / srv.denominator;
  769|       |
  770|      6|		if (VIPS_FABS(old_value - value) > 0.0001) {
  ------------------
  |  |   76|      6|#define VIPS_FABS(V) __builtin_fabs(V)
  ------------------
  |  Branch (770:7): [True: 4, False: 2]
  ------------------
  771|      4|			vips_exif_double_to_srational(value, &srv);
  772|       |
  773|      4|			VIPS_DEBUG_MSG("vips_exif_set_double: %d / %d\n",
  ------------------
  |  |   47|      4|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      4|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      4|	{ \
  |  |   49|      4|		; \
  |  |   50|      4|	} \
  |  |   51|      4|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      4|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  774|      4|				srv.numerator, srv.denominator);
  775|       |
  776|      4|			exif_set_srational(entry->data + offset, bo, srv);
  777|      4|		}
  778|      6|	}
  779|  23.6k|}
exif.c:vips_exif_double_to_rational:
  624|  18.0k|{
  625|       |	/* We will usually set factors of 10, so use 1000 as the denominator
  626|       |	 * and it'll probably be OK.
  627|       |	 */
  628|  18.0k|	rv->numerator = value * 1000;
  629|  18.0k|	rv->denominator = 1000;
  630|  18.0k|}
exif.c:vips_exif_double_to_srational:
  634|      4|{
  635|       |	/* We will usually set factors of 10, so use 1000 as the denominator
  636|       |	 * and it'll probably be OK.
  637|       |	 */
  638|      4|	srv->numerator = value * 1000;
  639|      4|	srv->denominator = 1000;
  640|      4|}
exif.c:vips_exif_set_int:
  591|  48.0k|{
  592|  48.0k|	int value = *((int *) data);
  593|       |
  594|  48.0k|	ExifByteOrder bo;
  595|  48.0k|	size_t sizeof_component;
  596|  48.0k|	size_t offset = component;
  597|       |
  598|  48.0k|	if (entry->components <= component) {
  ------------------
  |  Branch (598:6): [True: 0, False: 48.0k]
  ------------------
  599|      0|		VIPS_DEBUG_MSG("vips_exif_set_int: too few components\n");
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  600|      0|		return;
  601|      0|	}
  602|       |
  603|       |	/* Wait until after the component check to make sure we can't get /0.
  604|       |	 */
  605|  48.0k|	bo = exif_data_get_byte_order(ed);
  606|  48.0k|	sizeof_component = entry->size / entry->components;
  607|  48.0k|	offset = component * sizeof_component;
  608|       |
  609|  48.0k|	VIPS_DEBUG_MSG("vips_exif_set_int: %s = %d\n",
  ------------------
  |  |   47|  48.0k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  48.0k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  48.0k|	{ \
  |  |   49|  48.0k|		; \
  |  |   50|  48.0k|	} \
  |  |   51|  48.0k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  48.0k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  610|  48.0k|		vips_exif_entry_get_name(entry), value);
  611|       |
  612|  48.0k|	if (entry->format == EXIF_FORMAT_SHORT)
  ------------------
  |  Branch (612:6): [True: 25.7k, False: 22.3k]
  ------------------
  613|  25.7k|		exif_set_short(entry->data + offset, bo, value);
  614|  22.3k|	else if (entry->format == EXIF_FORMAT_SSHORT)
  ------------------
  |  Branch (614:11): [True: 26, False: 22.3k]
  ------------------
  615|     26|		exif_set_sshort(entry->data + offset, bo, value);
  616|  22.3k|	else if (entry->format == EXIF_FORMAT_LONG)
  ------------------
  |  Branch (616:11): [True: 22.1k, False: 235]
  ------------------
  617|  22.1k|		exif_set_long(entry->data + offset, bo, value);
  618|    235|	else if (entry->format == EXIF_FORMAT_SLONG)
  ------------------
  |  Branch (618:11): [True: 226, False: 9]
  ------------------
  619|    226|		exif_set_slong(entry->data + offset, bo, value);
  620|  48.0k|}
exif.c:vips_exif_update:
 1394|  10.9k|{
 1395|  10.9k|	VipsExifRemove ve;
 1396|       |
 1397|  10.9k|	VIPS_DEBUG_MSG("vips_exif_update: \n");
  ------------------
  |  |   47|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  10.9k|	{ \
  |  |   49|  10.9k|		; \
  |  |   50|  10.9k|	} \
  |  |   51|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1398|       |
 1399|       |	/* If this exif came from the image (rather than being an exif block we
 1400|       |	 * have made afresh), then any fields which are in the block but not on
 1401|       |	 * the image must have been deliberately removed. Remove them from the
 1402|       |	 * block as well.
 1403|       |	 *
 1404|       |	 * Any string-valued fields (eg. comment etc.) which exist as libvips
 1405|       |	 * metadata tags with changed  whose values have changed must also be
 1406|       |	 * removed.
 1407|       |	 *
 1408|       |	 * libexif does not allow you to change string lengths (you must make
 1409|       |	 * new tags) so we have to remove ready to re-add.
 1410|       |	 */
 1411|  10.9k|	if (vips_image_get_typeof(image, VIPS_META_EXIF_NAME)) {
  ------------------
  |  |   46|  10.9k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (1411:6): [True: 419, False: 10.5k]
  ------------------
 1412|    419|		ve.image = image;
 1413|    419|		ve.ed = ed;
 1414|    419|		exif_data_foreach_content(ed,
 1415|    419|			(ExifDataForeachContentFunc) vips_exif_exif_content,
 1416|    419|			&ve);
 1417|    419|	}
 1418|       |
 1419|       |	/* Walk the image and add any exif- that's set in image metadata.
 1420|       |	 */
 1421|  10.9k|	vips_image_map(image, vips_exif_image_field, ed);
 1422|  10.9k|}
exif.c:vips_exif_exif_content:
 1382|  2.09k|{
 1383|  2.09k|	ve->content = content;
 1384|  2.09k|	ve->to_remove = NULL;
 1385|  2.09k|	exif_content_foreach_entry(content,
 1386|  2.09k|		(ExifContentForeachEntryFunc) vips_exif_exif_entry, ve);
 1387|  2.09k|	vips_slist_map2(ve->to_remove,
 1388|  2.09k|		(VipsSListMap2Fn) vips_exif_exif_remove, ve, NULL);
 1389|  2.09k|	VIPS_FREEF(g_slist_free, ve->to_remove);
  ------------------
  |  |   41|  2.09k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.09k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.09k|	{ \
  |  |   43|  2.09k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 164, False: 1.93k]
  |  |  ------------------
  |  |   44|    164|			(void) F((S)); \
  |  |   45|    164|			(S) = 0; \
  |  |   46|    164|		} \
  |  |   47|  2.09k|	} \
  |  |   48|  2.09k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.09k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1390|  2.09k|}
exif.c:vips_exif_exif_entry:
 1297|  8.59k|{
 1298|  8.59k|	const char *tag_name;
 1299|  8.59k|	char vips_name_txt[256];
 1300|  8.59k|	VipsBuf vips_name_buf = VIPS_BUF_STATIC(vips_name_txt);
  ------------------
  |  |   60|  8.59k|	{ \
  |  |   61|  8.59k|		&TEXT[0], sizeof(TEXT), 0, FALSE, 0, FALSE \
  |  |  ------------------
  |  |  |  |  794|  8.59k|#define	FALSE	(0)
  |  |  ------------------
  |  |               		&TEXT[0], sizeof(TEXT), 0, FALSE, 0, FALSE \
  |  |  ------------------
  |  |  |  |  794|  8.59k|#define	FALSE	(0)
  |  |  ------------------
  |  |   62|  8.59k|	}
  ------------------
 1301|       |
 1302|  8.59k|	const char *vips_name;
 1303|  8.59k|	const char *vips_value;
 1304|       |
 1305|  8.59k|	if (!(tag_name = vips_exif_entry_get_name(entry)))
  ------------------
  |  Branch (1305:6): [True: 0, False: 8.59k]
  ------------------
 1306|      0|		return;
 1307|       |
 1308|  8.59k|	vips_buf_appendf(&vips_name_buf, "exif-ifd%d-%s",
 1309|  8.59k|		exif_entry_get_ifd(entry), tag_name);
  ------------------
  |  |  182|  8.59k|#define exif_entry_get_ifd(e) ((e)?exif_content_get_ifd((e)->parent):EXIF_IFD_COUNT)
  |  |  ------------------
  |  |  |  Branch (182:32): [True: 8.59k, False: 0]
  |  |  ------------------
  ------------------
 1310|  8.59k|	vips_name = vips_buf_all(&vips_name_buf);
 1311|       |
 1312|       |	/* Is there a image metadata item for this tag?
 1313|       |	 */
 1314|  8.59k|	vips_value = NULL;
 1315|  8.59k|	if (vips_image_get_typeof(ve->image, vips_name)) {
  ------------------
  |  Branch (1315:6): [True: 8.59k, False: 0]
  ------------------
 1316|       |		/* No easy way to return an error code from here, sadly.
 1317|       |		 */
 1318|  8.59k|		if (vips_image_get_string(ve->image, vips_name, &vips_value))
  ------------------
  |  Branch (1318:7): [True: 0, False: 8.59k]
  ------------------
 1319|      0|			g_warning(_("bad exif meta \"%s\""), vips_name);
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1320|  8.59k|	}
 1321|       |
 1322|       |	/* Does this field exist on the image? If not, schedule it for
 1323|       |	 * removal.
 1324|       |	 */
 1325|  8.59k|	if (!vips_value)
  ------------------
  |  Branch (1325:6): [True: 0, False: 8.59k]
  ------------------
 1326|      0|		ve->to_remove = g_slist_prepend(ve->to_remove, entry);
 1327|       |
 1328|       |	/* Orientation is really set from the vips
 1329|       |	 * VIPS_META_ORIENTATION tag. If that's been deleted, we must delete
 1330|       |	 * any matching EXIF tags too.
 1331|       |	 */
 1332|  8.59k|	if (strcmp(tag_name, "Orientation") == 0 &&
  ------------------
  |  Branch (1332:6): [True: 164, False: 8.42k]
  ------------------
 1333|  8.59k|		vips_value)
  ------------------
  |  Branch (1333:3): [True: 164, False: 0]
  ------------------
 1334|    164|		ve->to_remove = g_slist_prepend(ve->to_remove, entry);
 1335|       |
 1336|       |	/* If this is a string tag with a new value, we must also remove it
 1337|       |	 * ready for recreation, see the comment below.
 1338|       |	 */
 1339|  8.59k|	if (vips_value &&
  ------------------
  |  Branch (1339:6): [True: 8.59k, False: 0]
  ------------------
 1340|  8.59k|		(tag_is_encoding(entry->tag) ||
  ------------------
  |  Branch (1340:4): [True: 21, False: 8.57k]
  ------------------
 1341|  8.59k|			tag_is_ascii(entry->tag) ||
  ------------------
  |  Branch (1341:4): [True: 1.15k, False: 7.41k]
  ------------------
 1342|  8.59k|			tag_is_utf16(entry->tag))) {
  ------------------
  |  Branch (1342:4): [True: 1, False: 7.41k]
  ------------------
 1343|  1.18k|		VipsDbuf value = { 0 };
 1344|       |
 1345|       |		/* Render the original exif-data value to a string and see
 1346|       |		 * if the user has changed it. If they have, remove it ready
 1347|       |		 * for re-adding.
 1348|       |		 *
 1349|       |		 * Leaving it there prevents it being recreated.
 1350|       |		 */
 1351|  1.18k|		vips_exif_to_s(ve->ed, entry, &value);
 1352|  1.18k|		if (strcmp((char *) vips_dbuf_string(&value, NULL), vips_value) != 0)
  ------------------
  |  Branch (1352:7): [True: 0, False: 1.18k]
  ------------------
 1353|      0|			ve->to_remove = g_slist_prepend(ve->to_remove, entry);
 1354|  1.18k|		vips_dbuf_destroy(&value);
 1355|  1.18k|	}
 1356|  8.59k|}
exif.c:vips_exif_exif_remove:
 1360|    164|{
 1361|       |#ifdef DEBUG
 1362|       |	{
 1363|       |		const char *tag_name;
 1364|       |		char vips_name_txt[256];
 1365|       |		VipsBuf vips_name = VIPS_BUF_STATIC(vips_name_txt);
 1366|       |
 1367|       |		tag_name = vips_exif_entry_get_name(entry);
 1368|       |		vips_buf_appendf(&vips_name, "exif-ifd%d-%s",
 1369|       |			exif_entry_get_ifd(entry), tag_name);
 1370|       |
 1371|       |		printf("vips_exif_exif_remove: %s\n", vips_buf_all(&vips_name));
 1372|       |	}
 1373|       |#endif /*DEBUG*/
 1374|       |
 1375|    164|	exif_content_remove_entry(ve->content, entry);
 1376|       |
 1377|    164|	return NULL;
 1378|    164|}
exif.c:vips_exif_image_field:
 1246|   176k|{
 1247|   176k|	ExifData *ed = (ExifData *) data;
 1248|       |
 1249|   176k|	const char *string;
 1250|   176k|	int ifd;
 1251|   176k|	const char *p;
 1252|   176k|	ExifTag tag;
 1253|       |
 1254|   176k|	if (!vips_isprefix("exif-ifd", field))
  ------------------
  |  Branch (1254:6): [True: 167k, False: 8.59k]
  ------------------
 1255|   167k|		return NULL;
 1256|       |
 1257|       |	/* value must be a string.
 1258|       |	 */
 1259|  8.59k|	if (vips_image_get_string(image, field, &string)) {
  ------------------
  |  Branch (1259:6): [True: 0, False: 8.59k]
  ------------------
 1260|      0|		g_warning(_("bad exif meta \"%s\""), field);
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1261|      0|		return NULL;
 1262|      0|	}
 1263|       |
 1264|  8.59k|	p = field + strlen("exif-ifd");
 1265|  8.59k|	ifd = atoi(p);
 1266|       |
 1267|  17.1k|	for (; g_ascii_isdigit(*p); p++)
  ------------------
  |  |   66|  17.1k|  ((g_ascii_table[(guchar) (c)] & G_ASCII_DIGIT) != 0)
  |  |  ------------------
  |  |  |  Branch (66:3): [True: 8.59k, False: 8.59k]
  |  |  ------------------
  ------------------
 1268|  8.59k|		;
 1269|  8.59k|	if (*p != '-') {
  ------------------
  |  Branch (1269:6): [True: 0, False: 8.59k]
  ------------------
 1270|      0|		g_warning(_("bad exif meta \"%s\""), field);
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1271|      0|		return NULL;
 1272|      0|	}
 1273|       |
 1274|       |	/* GPSVersionID is tag 0 (the error return) so we have to
 1275|       |	 * test the name too.
 1276|       |	 */
 1277|  8.59k|	if (!(tag = exif_tag_from_name(p + 1)) &&
  ------------------
  |  Branch (1277:6): [True: 63, False: 8.53k]
  ------------------
 1278|  8.59k|		strcmp(p + 1, "GPSVersionID") != 0) {
  ------------------
  |  Branch (1278:3): [True: 0, False: 63]
  ------------------
 1279|      0|		g_warning(_("bad exif meta \"%s\""), field);
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1280|      0|		return NULL;
 1281|      0|	}
 1282|       |
 1283|  8.59k|	vips_exif_set_tag(ed, ifd, tag, vips_exif_set_entry, (void *) string);
 1284|       |
 1285|  8.59k|	return NULL;
 1286|  8.59k|}
exif.c:vips_exif_set_entry:
 1237|  8.59k|{
 1238|  8.59k|	const char *string = (const char *) data;
 1239|       |
 1240|  8.59k|	vips_exif_from_s(ed, entry, string);
 1241|  8.59k|}
exif.c:vips_exif_from_s:
 1194|  8.59k|{
 1195|  8.59k|	unsigned long i;
 1196|  8.59k|	const char *p;
 1197|  8.59k|	int v;
 1198|       |
 1199|  8.59k|	if (entry->format == EXIF_FORMAT_SHORT ||
  ------------------
  |  Branch (1199:6): [True: 2.90k, False: 5.68k]
  ------------------
 1200|  8.59k|		entry->format == EXIF_FORMAT_SSHORT ||
  ------------------
  |  Branch (1200:3): [True: 76, False: 5.60k]
  ------------------
 1201|  8.59k|		entry->format == EXIF_FORMAT_LONG ||
  ------------------
  |  Branch (1201:3): [True: 364, False: 5.24k]
  ------------------
 1202|  8.59k|		entry->format == EXIF_FORMAT_SLONG) {
  ------------------
  |  Branch (1202:3): [True: 133, False: 5.11k]
  ------------------
 1203|  3.48k|		if (entry->components >= 10)
  ------------------
  |  Branch (1203:7): [True: 259, False: 3.22k]
  ------------------
 1204|    259|			return;
 1205|       |
 1206|  3.22k|		p = value;
 1207|  6.73k|		for (i = 0; i < entry->components; i++) {
  ------------------
  |  Branch (1207:15): [True: 3.51k, False: 3.22k]
  ------------------
 1208|  3.51k|			if (!(p = skip_space(p)))
  ------------------
  |  Branch (1208:8): [True: 0, False: 3.51k]
  ------------------
 1209|      0|				break;
 1210|       |
 1211|  3.51k|			v = atof(p);
 1212|  3.51k|			vips_exif_set_int(ed, entry, i, &v);
 1213|       |
 1214|  3.51k|			p = skip_nonspace(p);
 1215|  3.51k|		}
 1216|  3.22k|	}
 1217|  5.11k|	else if (entry->format == EXIF_FORMAT_RATIONAL ||
  ------------------
  |  Branch (1217:11): [True: 1.80k, False: 3.30k]
  ------------------
 1218|  5.11k|		entry->format == EXIF_FORMAT_SRATIONAL) {
  ------------------
  |  Branch (1218:3): [True: 297, False: 3.01k]
  ------------------
 1219|  2.10k|		if (entry->components >= 10)
  ------------------
  |  Branch (1219:7): [True: 78, False: 2.02k]
  ------------------
 1220|     78|			return;
 1221|       |
 1222|  2.02k|		p = value;
 1223|  4.71k|		for (i = 0; i < entry->components; i++) {
  ------------------
  |  Branch (1223:15): [True: 2.68k, False: 2.02k]
  ------------------
 1224|  2.68k|			if (!(p = skip_space(p)))
  ------------------
  |  Branch (1224:8): [True: 0, False: 2.68k]
  ------------------
 1225|      0|				break;
 1226|       |
 1227|  2.68k|			vips_exif_set_rational(ed, entry, i, (void *) p);
 1228|       |
 1229|  2.68k|			p = skip_nonspace(p);
 1230|  2.68k|		}
 1231|  2.02k|	}
 1232|  8.59k|}
exif.c:skip_space:
 1170|  6.20k|{
 1171|  7.17k|	while (p && *p == ' ')
  ------------------
  |  Branch (1171:9): [True: 7.17k, False: 0]
  |  Branch (1171:14): [True: 973, False: 6.20k]
  ------------------
 1172|    973|		p += 1;
 1173|       |
 1174|  6.20k|	return p;
 1175|  6.20k|}
exif.c:skip_nonspace:
 1181|  6.20k|{
 1182|  44.9k|	while (p && *p && *p != ' ')
  ------------------
  |  Branch (1182:9): [True: 44.9k, False: 0]
  |  Branch (1182:14): [True: 44.9k, False: 0]
  |  Branch (1182:20): [True: 38.7k, False: 6.20k]
  ------------------
 1183|  38.7k|		p += 1;
 1184|       |
 1185|  6.20k|	return p;
 1186|  6.20k|}
exif.c:vips_exif_set_rational:
  668|  2.68k|{
  669|  2.68k|	char *value = (char *) data;
  670|       |
  671|  2.68k|	ExifByteOrder bo;
  672|  2.68k|	size_t sizeof_component;
  673|  2.68k|	size_t offset;
  674|       |
  675|  2.68k|	if (entry->components <= component) {
  ------------------
  |  Branch (675:6): [True: 0, False: 2.68k]
  ------------------
  676|      0|		VIPS_DEBUG_MSG("vips_exif_set_rational: too few components\n");
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  677|      0|		return;
  678|      0|	}
  679|       |
  680|       |	/* Wait until after the component check to make sure we can't get /0.
  681|       |	 */
  682|  2.68k|	bo = exif_data_get_byte_order(ed);
  683|  2.68k|	sizeof_component = entry->size / entry->components;
  684|  2.68k|	offset = component * sizeof_component;
  685|       |
  686|  2.68k|	VIPS_DEBUG_MSG("vips_exif_set_rational: %s = \"%s\"\n",
  ------------------
  |  |   47|  2.68k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.68k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.68k|	{ \
  |  |   49|  2.68k|		; \
  |  |   50|  2.68k|	} \
  |  |   51|  2.68k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.68k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  687|  2.68k|		vips_exif_entry_get_name(entry), value);
  688|       |
  689|  2.68k|	if (entry->format == EXIF_FORMAT_RATIONAL) {
  ------------------
  |  Branch (689:6): [True: 2.20k, False: 485]
  ------------------
  690|  2.20k|		ExifRational rv;
  691|       |
  692|  2.20k|		vips_exif_parse_rational(value, &rv);
  693|       |
  694|  2.20k|		VIPS_DEBUG_MSG("vips_exif_set_rational: %u / %u\n",
  ------------------
  |  |   47|  2.20k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.20k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.20k|	{ \
  |  |   49|  2.20k|		; \
  |  |   50|  2.20k|	} \
  |  |   51|  2.20k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.20k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  695|  2.20k|			rv.numerator,
  696|  2.20k|			rv.denominator);
  697|       |
  698|  2.20k|		exif_set_rational(entry->data + offset, bo, rv);
  699|  2.20k|	}
  700|    485|	else if (entry->format == EXIF_FORMAT_SRATIONAL) {
  ------------------
  |  Branch (700:11): [True: 485, False: 0]
  ------------------
  701|    485|		ExifSRational srv;
  702|       |
  703|    485|		vips_exif_parse_srational(value, &srv);
  704|       |
  705|    485|		VIPS_DEBUG_MSG("vips_exif_set_rational: %d / %d\n",
  ------------------
  |  |   47|    485|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    485|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    485|	{ \
  |  |   49|    485|		; \
  |  |   50|    485|	} \
  |  |   51|    485|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    485|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  706|    485|			srv.numerator, srv.denominator);
  707|       |
  708|    485|		exif_set_srational(entry->data + offset, bo, srv);
  709|    485|	}
  710|  2.68k|}
exif.c:vips_exif_parse_rational:
  646|  2.20k|{
  647|  2.20k|	if (sscanf(str, " %u / %u ", &rv->numerator, &rv->denominator) == 2)
  ------------------
  |  Branch (647:6): [True: 2.20k, False: 0]
  ------------------
  648|  2.20k|		return;
  649|      0|	vips_exif_double_to_rational(g_ascii_strtod(str, NULL), rv);
  650|      0|}
exif.c:vips_exif_parse_srational:
  656|    485|{
  657|    485|	if (sscanf(str, " %d / %d ",
  ------------------
  |  Branch (657:6): [True: 485, False: 0]
  ------------------
  658|    485|			&srv->numerator, &srv->denominator) == 2)
  659|    485|		return;
  660|      0|	vips_exif_double_to_srational(g_ascii_strtod(str, NULL), srv);
  661|      0|}
exif.c:vips_exif_set_dimensions:
 1090|  10.9k|{
 1091|  10.9k|	VIPS_DEBUG_MSG("vips_exif_set_dimensions: vips size of %d, %d\n",
  ------------------
  |  |   47|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  10.9k|	{ \
  |  |   49|  10.9k|		; \
  |  |   50|  10.9k|	} \
  |  |   51|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1092|  10.9k|		im->Xsize, im->Ysize);
 1093|       |
 1094|  10.9k|	vips_exif_set_tag(ed, 2, EXIF_TAG_PIXEL_X_DIMENSION,
 1095|  10.9k|		vips_exif_set_int, (void *) &im->Xsize);
 1096|  10.9k|	vips_exif_set_tag(ed, 2, EXIF_TAG_PIXEL_Y_DIMENSION,
 1097|  10.9k|		vips_exif_set_int, (void *) &im->Ysize);
 1098|       |
 1099|  10.9k|	return 0;
 1100|  10.9k|}
exif.c:vips_exif_set_orientation:
 1106|  10.9k|{
 1107|  10.9k|	int orientation;
 1108|       |
 1109|       |	/* We set the tag, even if it's been deleted, since it's a required
 1110|       |	 * field.
 1111|       |	 */
 1112|  10.9k|	if (!vips_image_get_typeof(im, VIPS_META_ORIENTATION) ||
  ------------------
  |  |  149|  10.9k|#define VIPS_META_ORIENTATION "orientation"
  ------------------
  |  Branch (1112:6): [True: 7.02k, False: 3.89k]
  ------------------
 1113|  10.9k|		vips_image_get_int(im, VIPS_META_ORIENTATION, &orientation))
  ------------------
  |  |  149|  3.89k|#define VIPS_META_ORIENTATION "orientation"
  ------------------
  |  Branch (1113:3): [True: 0, False: 3.89k]
  ------------------
 1114|  7.02k|		orientation = 1;
 1115|       |
 1116|  10.9k|	VIPS_DEBUG_MSG("set_exif_orientation: %d\n", orientation);
  ------------------
  |  |   47|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  10.9k|	{ \
  |  |   49|  10.9k|		; \
  |  |   50|  10.9k|	} \
  |  |   51|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1117|       |
 1118|  10.9k|	vips_exif_set_tag(ed, 0, EXIF_TAG_ORIENTATION,
 1119|  10.9k|		vips_exif_set_int, (void *) &orientation);
 1120|       |
 1121|  10.9k|	return 0;
 1122|  10.9k|}
exif.c:vips_exif_set_thumbnail:
 1128|  10.9k|{
 1129|       |	/* Delete any old thumbnail data. We should use the exif free func,
 1130|       |	 * but the memory allocator is not exposed by libexif! Hopefully they
 1131|       |	 * are just using free().
 1132|       |	 *
 1133|       |	 * exif.c makes this assumption too when it tries to update a
 1134|       |	 * thumbnail.
 1135|       |	 */
 1136|  10.9k|	if (ed->data) {
  ------------------
  |  Branch (1136:6): [True: 82, False: 10.8k]
  ------------------
 1137|     82|		free(ed->data);
 1138|     82|		ed->data = NULL;
 1139|     82|	}
 1140|  10.9k|	ed->size = 0;
 1141|       |
 1142|       |	/* Update EXIF thumbnail from metadata, if any.
 1143|       |	 */
 1144|  10.9k|	if (vips_image_get_typeof(im, "jpeg-thumbnail-data")) {
  ------------------
  |  Branch (1144:6): [True: 82, False: 10.8k]
  ------------------
 1145|     82|		const void *data;
 1146|     82|		size_t size;
 1147|       |
 1148|     82|		if (vips_image_get_blob(im, "jpeg-thumbnail-data",
  ------------------
  |  Branch (1148:7): [True: 0, False: 82]
  ------------------
 1149|     82|				&data, &size))
 1150|      0|			return -1;
 1151|       |
 1152|       |		/* Again, we should use the exif allocator attached to this
 1153|       |		 * entry, but it is not exposed!
 1154|       |		 */
 1155|     82|		if (size > 0 &&
  ------------------
  |  Branch (1155:7): [True: 82, False: 0]
  ------------------
 1156|     82|			data) {
  ------------------
  |  Branch (1156:4): [True: 82, False: 0]
  ------------------
 1157|     82|			ed->data = malloc(size);
 1158|     82|			memcpy(ed->data, data, size);
 1159|     82|			ed->size = size;
 1160|     82|		}
 1161|     82|	}
 1162|       |
 1163|  10.9k|	return 0;
 1164|  10.9k|}

vips_foreign_map:
  468|  27.6k|{
  469|  27.6k|	GSList *files;
  470|  27.6k|	void *result;
  471|       |
  472|  27.6k|	files = NULL;
  473|  27.6k|	(void) vips_class_map_all(g_type_from_name(base),
  474|  27.6k|		(VipsClassMapFn) file_add_class, (void *) &files);
  475|       |
  476|  27.6k|	files = g_slist_sort(files, (GCompareFunc) file_compare);
  477|       |#ifdef DEBUG
  478|       |	{
  479|       |		GSList *p;
  480|       |
  481|       |		printf("vips_foreign_map: search order\n");
  482|       |		for (p = files; p; p = p->next) {
  483|       |			VipsForeignClass *class = (VipsForeignClass *) p->data;
  484|       |
  485|       |			printf("\t%s\n", VIPS_OBJECT_CLASS(class)->nickname);
  486|       |		}
  487|       |	}
  488|       |#endif /*DEBUG*/
  489|  27.6k|	result = vips_slist_map2(files, fn, a, b);
  490|       |
  491|  27.6k|	g_slist_free(files);
  492|       |
  493|  27.6k|	return result;
  494|  27.6k|}
vips_foreign_find_load_buffer:
  700|  16.7k|{
  701|  16.7k|	VipsForeignLoadClass *load_class;
  702|       |
  703|  16.7k|	if (!(load_class = (VipsForeignLoadClass *) vips_foreign_map(
  ------------------
  |  Branch (703:6): [True: 2.00k, False: 14.7k]
  ------------------
  704|  16.7k|			  "VipsForeignLoad",
  705|  16.7k|			  (VipsSListMap2Fn) vips_foreign_find_load_buffer_sub,
  706|  16.7k|			  &data, &size))) {
  707|  2.00k|		vips_error("VipsForeignLoad",
  708|  2.00k|			"%s", _("buffer is not in a known format"));
  ------------------
  |  |   30|  2.00k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  2.00k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  709|  2.00k|		return NULL;
  710|  2.00k|	}
  711|       |
  712|  14.7k|	return G_OBJECT_CLASS_NAME(load_class);
  ------------------
  |  |  124|  14.7k|#define G_OBJECT_CLASS_NAME(class)  (g_type_name (G_OBJECT_CLASS_TYPE (class)))
  |  |  ------------------
  |  |  |  |  114|  14.7k|#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  14.7k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  713|  16.7k|}
vips_foreign_load_invalidate:
 1306|  1.12k|{
 1307|  1.12k|	VipsOperation *operation;
 1308|       |
 1309|       |#ifdef DEBUG
 1310|       |	printf("vips_foreign_load_invalidate: %p\n", image);
 1311|       |#endif /*DEBUG*/
 1312|       |
 1313|  1.12k|	if ((operation = g_object_get_qdata(G_OBJECT(image),
  ------------------
  |  |   51|  1.12k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  1.12k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.12k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1313:6): [True: 1.12k, False: 0]
  ------------------
 1314|  1.12k|			 vips__foreign_load_operation))) {
 1315|  1.12k|		vips_operation_invalidate(operation);
 1316|  1.12k|	}
 1317|  1.12k|}
vips__foreign_convert_saveable:
 1372|  10.9k|{
 1373|       |	/* in holds a reference to the output of our chain as we build it.
 1374|       |	 */
 1375|  10.9k|	g_object_ref(in);
 1376|       |
 1377|       |	/* For coded images, can this class save the coding we are in now?
 1378|       |	 * Nothing to do.
 1379|       |	 */
 1380|  10.9k|	if (in->Coding != VIPS_CODING_NONE &&
  ------------------
  |  Branch (1380:6): [True: 129, False: 10.7k]
  ------------------
 1381|  10.9k|		coding[in->Coding]) {
  ------------------
  |  Branch (1381:3): [True: 0, False: 129]
  ------------------
 1382|      0|		*ready = in;
 1383|      0|		return 0;
 1384|      0|	}
 1385|       |
 1386|       |	/* For uncoded images, if this saver supports ANY bands and this
 1387|       |	 * format we have nothing to do.
 1388|       |	 */
 1389|  10.9k|	if (in->Coding == VIPS_CODING_NONE &&
  ------------------
  |  Branch (1389:6): [True: 10.7k, False: 129]
  ------------------
 1390|  10.9k|		saveable == VIPS_SAVEABLE_ANY &&
  ------------------
  |  Branch (1390:3): [True: 0, False: 10.7k]
  ------------------
 1391|  10.9k|		format[in->BandFmt] == in->BandFmt) {
  ------------------
  |  Branch (1391:3): [True: 0, False: 0]
  ------------------
 1392|      0|		*ready = in;
 1393|      0|		return 0;
 1394|      0|	}
 1395|       |
 1396|       |	/* Otherwise ... we need to decode and then (possibly) recode at the
 1397|       |	 * end.
 1398|       |	 */
 1399|       |
 1400|       |	/* If this is an VIPS_CODING_LABQ, we can go straight to RGB.
 1401|       |	 */
 1402|  10.9k|	if (in->Coding == VIPS_CODING_LABQ) {
  ------------------
  |  Branch (1402:6): [True: 27, False: 10.8k]
  ------------------
 1403|     27|		VipsImage *out;
 1404|       |
 1405|     27|		if (vips_LabQ2sRGB(in, &out, NULL)) {
  ------------------
  |  Branch (1405:7): [True: 0, False: 27]
  ------------------
 1406|      0|			g_object_unref(in);
 1407|      0|			return -1;
 1408|      0|		}
 1409|     27|		g_object_unref(in);
 1410|       |
 1411|     27|		in = out;
 1412|     27|	}
 1413|       |
 1414|       |	/* If this is an VIPS_CODING_RAD, we unpack to float. This could be
 1415|       |	 * scRGB or XYZ.
 1416|       |	 */
 1417|  10.9k|	if (in->Coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (1417:6): [True: 102, False: 10.8k]
  ------------------
 1418|    102|		VipsImage *out;
 1419|       |
 1420|    102|		if (vips_rad2float(in, &out, NULL)) {
  ------------------
  |  Branch (1420:7): [True: 0, False: 102]
  ------------------
 1421|      0|			g_object_unref(in);
 1422|      0|			return -1;
 1423|      0|		}
 1424|    102|		g_object_unref(in);
 1425|       |
 1426|    102|		in = out;
 1427|    102|	}
 1428|       |
 1429|       |	/* If the saver supports RAD, we need to go to scRGB or XYZ.
 1430|       |	 */
 1431|  10.9k|	if (coding[VIPS_CODING_RAD]) {
  ------------------
  |  Branch (1431:6): [True: 0, False: 10.9k]
  ------------------
 1432|      0|		if (in->Type != VIPS_INTERPRETATION_scRGB &&
  ------------------
  |  Branch (1432:7): [True: 0, False: 0]
  ------------------
 1433|      0|			in->Type != VIPS_INTERPRETATION_XYZ) {
  ------------------
  |  Branch (1433:4): [True: 0, False: 0]
  ------------------
 1434|      0|			VipsImage *out;
 1435|       |
 1436|      0|			if (vips_colourspace(in, &out, VIPS_INTERPRETATION_scRGB, NULL)) {
  ------------------
  |  Branch (1436:8): [True: 0, False: 0]
  ------------------
 1437|      0|				g_object_unref(in);
 1438|      0|				return -1;
 1439|      0|			}
 1440|      0|			g_object_unref(in);
 1441|       |
 1442|      0|			in = out;
 1443|      0|		}
 1444|      0|	}
 1445|       |
 1446|       |	/* If this image is CMYK and the saver is RGB-only, use lcms to try to
 1447|       |	 * import to XYZ.
 1448|       |	 */
 1449|  10.9k|	if (in->Type == VIPS_INTERPRETATION_CMYK &&
  ------------------
  |  Branch (1449:6): [True: 528, False: 10.3k]
  ------------------
 1450|  10.9k|		in->Bands >= 4 &&
  ------------------
  |  Branch (1450:3): [True: 528, False: 0]
  ------------------
 1451|  10.9k|		(saveable == VIPS_SAVEABLE_RGB ||
  ------------------
  |  Branch (1451:4): [True: 0, False: 528]
  ------------------
 1452|    528|			saveable == VIPS_SAVEABLE_RGBA ||
  ------------------
  |  Branch (1452:4): [True: 0, False: 528]
  ------------------
 1453|    528|			saveable == VIPS_SAVEABLE_RGBA_ONLY)) {
  ------------------
  |  Branch (1453:4): [True: 528, False: 0]
  ------------------
 1454|    528|		VipsImage *out;
 1455|       |
 1456|    528|		if (vips_icc_import(in, &out,
  ------------------
  |  Branch (1456:7): [True: 0, False: 528]
  ------------------
 1457|    528|				"pcs", VIPS_PCS_XYZ,
 1458|    528|				"embedded", TRUE,
  ------------------
  |  |  798|    528|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    528|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1459|    528|				"input_profile", "cmyk",
 1460|    528|				NULL)) {
 1461|      0|			g_object_unref(in);
 1462|      0|			return -1;
 1463|      0|		}
 1464|    528|		g_object_unref(in);
 1465|       |
 1466|    528|		in = out;
 1467|    528|	}
 1468|       |
 1469|       |	/* If this is something other than CMYK or RAD, and it's not already
 1470|       |	 * an RGB image, eg. maybe a LAB image, we need to transform
 1471|       |	 * to RGB.
 1472|       |	 */
 1473|  10.9k|	if (!coding[VIPS_CODING_RAD] &&
  ------------------
  |  Branch (1473:6): [True: 10.9k, False: 0]
  ------------------
 1474|  10.9k|		in->Bands >= 3 &&
  ------------------
  |  Branch (1474:3): [True: 9.07k, False: 1.84k]
  ------------------
 1475|  10.9k|		in->Type != VIPS_INTERPRETATION_CMYK &&
  ------------------
  |  Branch (1475:3): [True: 9.07k, False: 0]
  ------------------
 1476|  10.9k|		in->Type != VIPS_INTERPRETATION_sRGB &&
  ------------------
  |  Branch (1476:3): [True: 1.80k, False: 7.27k]
  ------------------
 1477|  10.9k|		in->Type != VIPS_INTERPRETATION_RGB16 &&
  ------------------
  |  Branch (1477:3): [True: 1.30k, False: 494]
  ------------------
 1478|  10.9k|		vips_colourspace_issupported(in) &&
  ------------------
  |  Branch (1478:3): [True: 1.27k, False: 32]
  ------------------
 1479|  10.9k|		(saveable == VIPS_SAVEABLE_RGB ||
  ------------------
  |  Branch (1479:4): [True: 0, False: 1.27k]
  ------------------
 1480|  1.27k|			saveable == VIPS_SAVEABLE_RGBA ||
  ------------------
  |  Branch (1480:4): [True: 0, False: 1.27k]
  ------------------
 1481|  1.27k|			saveable == VIPS_SAVEABLE_RGBA_ONLY ||
  ------------------
  |  Branch (1481:4): [True: 1.27k, False: 0]
  ------------------
 1482|  1.27k|			saveable == VIPS_SAVEABLE_RGB_CMYK)) {
  ------------------
  |  Branch (1482:4): [True: 0, False: 0]
  ------------------
 1483|  1.27k|		VipsImage *out;
 1484|  1.27k|		VipsInterpretation interpretation;
 1485|       |
 1486|       |		/* Do we make RGB or RGB16? We don't want to squash a 16-bit
 1487|       |		 * RGB down to 8 bits if the saver supports 16.
 1488|       |		 */
 1489|  1.27k|		if (vips_band_format_is8bit(format[in->BandFmt]))
  ------------------
  |  Branch (1489:7): [True: 1.27k, False: 0]
  ------------------
 1490|  1.27k|			interpretation = VIPS_INTERPRETATION_sRGB;
 1491|      0|		else
 1492|      0|			interpretation = VIPS_INTERPRETATION_RGB16;
 1493|       |
 1494|  1.27k|		if (vips_colourspace(in, &out, interpretation, NULL)) {
  ------------------
  |  Branch (1494:7): [True: 0, False: 1.27k]
  ------------------
 1495|      0|			g_object_unref(in);
 1496|      0|			return -1;
 1497|      0|		}
 1498|  1.27k|		g_object_unref(in);
 1499|       |
 1500|  1.27k|		in = out;
 1501|  1.27k|	}
 1502|       |
 1503|       |	/* VIPS_SAVEABLE_RGBA_ONLY does not support mono types ... convert
 1504|       |	 * to sRGB.
 1505|       |	 */
 1506|  10.9k|	if (!coding[VIPS_CODING_RAD] &&
  ------------------
  |  Branch (1506:6): [True: 10.9k, False: 0]
  ------------------
 1507|  10.9k|		in->Bands < 3 &&
  ------------------
  |  Branch (1507:3): [True: 1.84k, False: 9.07k]
  ------------------
 1508|  10.9k|		saveable == VIPS_SAVEABLE_RGBA_ONLY) {
  ------------------
  |  Branch (1508:3): [True: 1.84k, False: 0]
  ------------------
 1509|  1.84k|		VipsImage *out;
 1510|  1.84k|		VipsInterpretation interpretation;
 1511|       |
 1512|       |		/* Do we make RGB or RGB16? We don't want to squash a 16-bit
 1513|       |		 * RGB down to 8 bits if the saver supports 16.
 1514|       |		 */
 1515|  1.84k|		if (vips_band_format_is8bit(format[in->BandFmt]))
  ------------------
  |  Branch (1515:7): [True: 1.84k, False: 0]
  ------------------
 1516|  1.84k|			interpretation = VIPS_INTERPRETATION_sRGB;
 1517|      0|		else
 1518|      0|			interpretation = VIPS_INTERPRETATION_RGB16;
 1519|       |
 1520|  1.84k|		if (vips_colourspace(in, &out, interpretation, NULL)) {
  ------------------
  |  Branch (1520:7): [True: 2, False: 1.84k]
  ------------------
 1521|      2|			g_object_unref(in);
 1522|      2|			return -1;
 1523|      2|		}
 1524|  1.84k|		g_object_unref(in);
 1525|       |
 1526|  1.84k|		in = out;
 1527|  1.84k|	}
 1528|       |
 1529|       |	/* Get the bands right. We must do this after all colourspace
 1530|       |	 * transforms, since they can change the number of bands.
 1531|       |	 */
 1532|  10.9k|	if (in->Coding == VIPS_CODING_NONE) {
  ------------------
  |  Branch (1532:6): [True: 10.9k, False: 0]
  ------------------
 1533|       |		/* Do we need to flatten out an alpha channel? There needs to
 1534|       |		 * be an alpha there now, and this writer needs to not support
 1535|       |		 * alpha.
 1536|       |		 */
 1537|  10.9k|		if ((in->Bands == 2 ||
  ------------------
  |  Branch (1537:8): [True: 0, False: 10.9k]
  ------------------
 1538|  10.9k|				(in->Bands == 4 &&
  ------------------
  |  Branch (1538:6): [True: 2.04k, False: 8.87k]
  ------------------
 1539|  10.9k|					in->Type != VIPS_INTERPRETATION_CMYK)) &&
  ------------------
  |  Branch (1539:6): [True: 2.04k, False: 0]
  ------------------
 1540|  10.9k|			(saveable == VIPS_SAVEABLE_MONO ||
  ------------------
  |  Branch (1540:5): [True: 0, False: 2.04k]
  ------------------
 1541|  2.04k|				saveable == VIPS_SAVEABLE_RGB ||
  ------------------
  |  Branch (1541:5): [True: 0, False: 2.04k]
  ------------------
 1542|  2.04k|				saveable == VIPS_SAVEABLE_RGB_CMYK)) {
  ------------------
  |  Branch (1542:5): [True: 0, False: 2.04k]
  ------------------
 1543|      0|			VipsImage *out;
 1544|       |
 1545|      0|			if (vips_flatten(in, &out,
  ------------------
  |  Branch (1545:8): [True: 0, False: 0]
  ------------------
 1546|      0|					"background", background,
 1547|      0|					NULL)) {
 1548|      0|				g_object_unref(in);
 1549|      0|				return -1;
 1550|      0|			}
 1551|      0|			g_object_unref(in);
 1552|       |
 1553|      0|			in = out;
 1554|      0|		}
 1555|       |
 1556|       |		/* Other alpha removal strategies ... just drop the extra
 1557|       |		 * bands.
 1558|       |		 */
 1559|       |
 1560|  10.9k|		else if (in->Bands > 3 &&
  ------------------
  |  Branch (1560:12): [True: 2.25k, False: 8.66k]
  ------------------
 1561|  10.9k|			(saveable == VIPS_SAVEABLE_RGB ||
  ------------------
  |  Branch (1561:5): [True: 0, False: 2.25k]
  ------------------
 1562|  2.25k|				(saveable == VIPS_SAVEABLE_RGB_CMYK &&
  ------------------
  |  Branch (1562:6): [True: 0, False: 2.25k]
  ------------------
 1563|  2.25k|					in->Type != VIPS_INTERPRETATION_CMYK))) {
  ------------------
  |  Branch (1563:6): [True: 0, False: 0]
  ------------------
 1564|      0|			VipsImage *out;
 1565|       |
 1566|       |			/* Don't let 4 bands though unless the image really is
 1567|       |			 * a CMYK.
 1568|       |			 *
 1569|       |			 * Consider a RGBA png being saved as JPG. We can
 1570|       |			 * write CMYK jpg, but we mustn't do that for RGBA
 1571|       |			 * images.
 1572|       |			 */
 1573|      0|			if (vips_extract_band(in, &out, 0,
  ------------------
  |  Branch (1573:8): [True: 0, False: 0]
  ------------------
 1574|      0|					"n", 3,
 1575|      0|					NULL)) {
 1576|      0|				g_object_unref(in);
 1577|      0|				return -1;
 1578|      0|			}
 1579|      0|			g_object_unref(in);
 1580|       |
 1581|      0|			in = out;
 1582|      0|		}
 1583|  10.9k|		else if (in->Bands > 4 &&
  ------------------
  |  Branch (1583:12): [True: 218, False: 10.7k]
  ------------------
 1584|  10.9k|			((saveable == VIPS_SAVEABLE_RGB_CMYK &&
  ------------------
  |  Branch (1584:6): [True: 0, False: 218]
  ------------------
 1585|    218|				 in->Type == VIPS_INTERPRETATION_CMYK) ||
  ------------------
  |  Branch (1585:6): [True: 0, False: 0]
  ------------------
 1586|    218|				saveable == VIPS_SAVEABLE_RGBA ||
  ------------------
  |  Branch (1586:5): [True: 0, False: 218]
  ------------------
 1587|    218|				saveable == VIPS_SAVEABLE_RGBA_ONLY)) {
  ------------------
  |  Branch (1587:5): [True: 218, False: 0]
  ------------------
 1588|    218|			VipsImage *out;
 1589|       |
 1590|    218|			if (vips_extract_band(in, &out, 0,
  ------------------
  |  Branch (1590:8): [True: 0, False: 218]
  ------------------
 1591|    218|					"n", 4,
 1592|    218|					NULL)) {
 1593|      0|				g_object_unref(in);
 1594|      0|				return -1;
 1595|      0|			}
 1596|    218|			g_object_unref(in);
 1597|       |
 1598|    218|			in = out;
 1599|    218|		}
 1600|  10.7k|		else if (in->Bands > 1 &&
  ------------------
  |  Branch (1600:12): [True: 10.7k, False: 0]
  ------------------
 1601|  10.7k|			saveable == VIPS_SAVEABLE_MONO) {
  ------------------
  |  Branch (1601:4): [True: 0, False: 10.7k]
  ------------------
 1602|      0|			VipsImage *out;
 1603|       |
 1604|      0|			if (vips_extract_band(in, &out, 0, NULL)) {
  ------------------
  |  Branch (1604:8): [True: 0, False: 0]
  ------------------
 1605|      0|				g_object_unref(in);
 1606|      0|				return -1;
 1607|      0|			}
 1608|      0|			g_object_unref(in);
 1609|       |
 1610|      0|			in = out;
 1611|      0|		}
 1612|       |
 1613|       |		/* Else we have VIPS_SAVEABLE_ANY and we don't chop bands down.
 1614|       |		 */
 1615|  10.9k|	}
 1616|       |
 1617|       |	/* Handle the ushort interpretations.
 1618|       |	 *
 1619|       |	 * RGB16 and GREY16 use 0-65535 for black-white. If we have an image
 1620|       |	 * tagged like this, and it has more than 8 bits (we leave crazy uchar
 1621|       |	 * images tagged as RGB16 alone), we'll need to get it ready for the
 1622|       |	 * saver.
 1623|       |	 */
 1624|  10.9k|	if ((in->Type == VIPS_INTERPRETATION_RGB16 ||
  ------------------
  |  Branch (1624:7): [True: 494, False: 10.4k]
  ------------------
 1625|  10.9k|			in->Type == VIPS_INTERPRETATION_GREY16) &&
  ------------------
  |  Branch (1625:4): [True: 0, False: 10.4k]
  ------------------
 1626|  10.9k|		!vips_band_format_is8bit(in->BandFmt)) {
  ------------------
  |  Branch (1626:3): [True: 494, False: 0]
  ------------------
 1627|       |		/* If the saver supports ushort, cast to ushort. It may be
 1628|       |		 * float at the moment, for example.
 1629|       |		 *
 1630|       |		 * If the saver does not support ushort, automatically shift
 1631|       |		 * it down. This is the behaviour we want for saving an RGB16
 1632|       |		 * image as JPG, for example.
 1633|       |		 */
 1634|    494|		if (format[VIPS_FORMAT_USHORT] == VIPS_FORMAT_USHORT) {
  ------------------
  |  Branch (1634:7): [True: 0, False: 494]
  ------------------
 1635|      0|			VipsImage *out;
 1636|       |
 1637|      0|			if (vips_cast(in, &out, VIPS_FORMAT_USHORT, NULL)) {
  ------------------
  |  Branch (1637:8): [True: 0, False: 0]
  ------------------
 1638|      0|				g_object_unref(in);
 1639|      0|				return -1;
 1640|      0|			}
 1641|      0|			g_object_unref(in);
 1642|       |
 1643|      0|			in = out;
 1644|      0|		}
 1645|    494|		else {
 1646|    494|			VipsImage *out;
 1647|       |
 1648|    494|			if (vips_rshift_const1(in, &out, 8, NULL)) {
  ------------------
  |  Branch (1648:8): [True: 0, False: 494]
  ------------------
 1649|      0|				g_object_unref(in);
 1650|      0|				return -1;
 1651|      0|			}
 1652|    494|			g_object_unref(in);
 1653|       |
 1654|    494|			in = out;
 1655|       |
 1656|       |			/* That could have produced an int image ... make sure
 1657|       |			 * we are now uchar.
 1658|       |			 */
 1659|    494|			if (vips_cast(in, &out, VIPS_FORMAT_UCHAR, NULL)) {
  ------------------
  |  Branch (1659:8): [True: 0, False: 494]
  ------------------
 1660|      0|				g_object_unref(in);
 1661|      0|				return -1;
 1662|      0|			}
 1663|    494|			g_object_unref(in);
 1664|       |
 1665|    494|			in = out;
 1666|    494|		}
 1667|    494|	}
 1668|       |
 1669|       |	/* Cast to the output format.
 1670|       |	 */
 1671|  10.9k|	{
 1672|  10.9k|		VipsImage *out;
 1673|       |
 1674|  10.9k|		if (vips_cast(in, &out, format[in->BandFmt], NULL)) {
  ------------------
  |  Branch (1674:7): [True: 0, False: 10.9k]
  ------------------
 1675|      0|			g_object_unref(in);
 1676|      0|			return -1;
 1677|      0|		}
 1678|  10.9k|		g_object_unref(in);
 1679|       |
 1680|  10.9k|		in = out;
 1681|  10.9k|	}
 1682|       |
 1683|       |	/* Does this class want a coded image? Search the coding table for the
 1684|       |	 * first one.
 1685|       |	 */
 1686|  10.9k|	if (coding[VIPS_CODING_NONE]) {
  ------------------
  |  Branch (1686:6): [True: 10.9k, False: 0]
  ------------------
 1687|       |		/* Already NONE, nothing to do.
 1688|       |		 */
 1689|  10.9k|	}
 1690|      0|	else if (coding[VIPS_CODING_LABQ]) {
  ------------------
  |  Branch (1690:11): [True: 0, False: 0]
  ------------------
 1691|      0|		VipsImage *out;
 1692|       |
 1693|      0|		if (vips_Lab2LabQ(in, &out, NULL)) {
  ------------------
  |  Branch (1693:7): [True: 0, False: 0]
  ------------------
 1694|      0|			g_object_unref(in);
 1695|      0|			return -1;
 1696|      0|		}
 1697|      0|		g_object_unref(in);
 1698|       |
 1699|      0|		in = out;
 1700|      0|	}
 1701|      0|	else if (coding[VIPS_CODING_RAD]) {
  ------------------
  |  Branch (1701:11): [True: 0, False: 0]
  ------------------
 1702|      0|		VipsImage *out;
 1703|       |
 1704|      0|		if (vips_float2rad(in, &out, NULL)) {
  ------------------
  |  Branch (1704:7): [True: 0, False: 0]
  ------------------
 1705|      0|			g_object_unref(in);
 1706|      0|			return -1;
 1707|      0|		}
 1708|      0|		g_object_unref(in);
 1709|       |
 1710|      0|		in = out;
 1711|      0|	}
 1712|       |
 1713|  10.9k|	*ready = in;
 1714|       |
 1715|  10.9k|	return 0;
 1716|  10.9k|}
vips__foreign_update_metadata:
 1751|  10.9k|{
 1752|       |	/* Rebuild exif from tags, if we'll be saving it.
 1753|       |	 */
 1754|  10.9k|	if ((keep & VIPS_FOREIGN_KEEP_EXIF) &&
  ------------------
  |  Branch (1754:6): [True: 10.9k, False: 0]
  ------------------
 1755|  10.9k|		vips__exif_update(in))
  ------------------
  |  Branch (1755:3): [True: 0, False: 10.9k]
  ------------------
 1756|      0|		return -1;
 1757|       |
 1758|       |	/* Remove metadata, if any.
 1759|       |	 */
 1760|  10.9k|	if (keep != VIPS_FOREIGN_KEEP_ALL &&
  ------------------
  |  Branch (1760:6): [True: 0, False: 10.9k]
  ------------------
 1761|  10.9k|		vips_image_map(in, vips_foreign_save_remove_metadata, &keep))
  ------------------
  |  Branch (1761:3): [True: 0, False: 0]
  ------------------
 1762|      0|		return -1;
 1763|       |
 1764|       |	/* Some format libraries, like libpng, will throw a hard error if the
 1765|       |	 * profile is inappropriate for this image type. With profiles inherited
 1766|       |	 * from a source image, this can happen all the time, so we
 1767|       |	 * want to silently drop the profile in this case.
 1768|       |	 */
 1769|  10.9k|	if ((keep & VIPS_FOREIGN_KEEP_ICC) &&
  ------------------
  |  Branch (1769:6): [True: 10.9k, False: 0]
  ------------------
 1770|  10.9k|		vips_image_get_typeof(in, VIPS_META_ICC_NAME)) {
  ------------------
  |  |   78|  10.9k|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  |  Branch (1770:3): [True: 48, False: 10.8k]
  ------------------
 1771|     48|		const void *data;
 1772|     48|		size_t length;
 1773|       |
 1774|     48|		if (!vips_image_get_blob(in, VIPS_META_ICC_NAME, &data, &length) &&
  ------------------
  |  |   78|     48|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  |  Branch (1774:7): [True: 48, False: 0]
  ------------------
 1775|     48|			!vips_icc_is_compatible_profile(in, data, length) &&
  ------------------
  |  Branch (1775:4): [True: 39, False: 9]
  ------------------
 1776|     48|			!vips_image_remove(in, VIPS_META_ICC_NAME))
  ------------------
  |  |   78|     39|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  |  Branch (1776:4): [True: 0, False: 39]
  ------------------
 1777|      0|			return -1;
 1778|     48|	}
 1779|       |
 1780|  10.9k|	return 0;
 1781|  10.9k|}
vips_foreign_find_save_target:
 2148|  10.9k|{
 2149|  10.9k|	char suffix[VIPS_PATH_MAX];
 2150|  10.9k|	char option_string[VIPS_PATH_MAX];
 2151|  10.9k|	VipsForeignSaveClass *save_class;
 2152|       |
 2153|  10.9k|	vips__filename_split8(name, suffix, option_string);
 2154|       |
 2155|  10.9k|	if (!(save_class = (VipsForeignSaveClass *) vips_foreign_map(
  ------------------
  |  Branch (2155:6): [True: 0, False: 10.9k]
  ------------------
 2156|  10.9k|			  "VipsForeignSave",
 2157|  10.9k|			  (VipsSListMap2Fn) vips_foreign_find_save_target_sub,
 2158|  10.9k|			  (void *) suffix, NULL))) {
 2159|      0|		vips_error("VipsForeignSave",
 2160|      0|			_("\"%s\" is not a known target format"), name);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2161|       |
 2162|      0|		return NULL;
 2163|      0|	}
 2164|       |
 2165|  10.9k|	return G_OBJECT_CLASS_NAME(save_class);
  ------------------
  |  |  124|  10.9k|#define G_OBJECT_CLASS_NAME(class)  (g_type_name (G_OBJECT_CLASS_TYPE (class)))
  |  |  ------------------
  |  |  |  |  114|  10.9k|#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  10.9k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2166|  10.9k|}
vips_foreign_operation_init:
 2939|      2|{
 2940|      2|	extern GType vips_foreign_load_rad_file_get_type(void);
 2941|      2|	extern GType vips_foreign_load_rad_buffer_get_type(void);
 2942|      2|	extern GType vips_foreign_load_rad_source_get_type(void);
 2943|      2|	extern GType vips_foreign_save_rad_file_get_type(void);
 2944|      2|	extern GType vips_foreign_save_rad_buffer_get_type(void);
 2945|      2|	extern GType vips_foreign_save_rad_target_get_type(void);
 2946|       |
 2947|      2|	extern GType vips_foreign_load_mat_get_type(void);
 2948|       |
 2949|      2|	extern GType vips_foreign_load_ppm_file_get_type(void);
 2950|      2|	extern GType vips_foreign_load_ppm_source_get_type(void);
 2951|      2|	extern GType vips_foreign_save_ppm_file_get_type(void);
 2952|      2|	extern GType vips_foreign_save_pbm_target_get_type(void);
 2953|      2|	extern GType vips_foreign_save_pgm_target_get_type(void);
 2954|      2|	extern GType vips_foreign_save_ppm_target_get_type(void);
 2955|      2|	extern GType vips_foreign_save_pfm_target_get_type(void);
 2956|      2|	extern GType vips_foreign_save_pnm_target_get_type(void);
 2957|       |
 2958|      2|	extern GType vips_foreign_load_png_file_get_type(void);
 2959|      2|	extern GType vips_foreign_load_png_buffer_get_type(void);
 2960|      2|	extern GType vips_foreign_load_png_source_get_type(void);
 2961|      2|	extern GType vips_foreign_save_png_file_get_type(void);
 2962|      2|	extern GType vips_foreign_save_png_buffer_get_type(void);
 2963|      2|	extern GType vips_foreign_save_png_target_get_type(void);
 2964|       |
 2965|      2|	extern GType vips_foreign_save_spng_file_get_type(void);
 2966|      2|	extern GType vips_foreign_save_spng_buffer_get_type(void);
 2967|      2|	extern GType vips_foreign_save_spng_target_get_type(void);
 2968|       |
 2969|      2|	extern GType vips_foreign_load_csv_file_get_type(void);
 2970|      2|	extern GType vips_foreign_load_csv_source_get_type(void);
 2971|      2|	extern GType vips_foreign_save_csv_file_get_type(void);
 2972|      2|	extern GType vips_foreign_save_csv_target_get_type(void);
 2973|       |
 2974|      2|	extern GType vips_foreign_load_matrix_file_get_type(void);
 2975|      2|	extern GType vips_foreign_load_matrix_source_get_type(void);
 2976|      2|	extern GType vips_foreign_save_matrix_file_get_type(void);
 2977|      2|	extern GType vips_foreign_save_matrix_target_get_type(void);
 2978|      2|	extern GType vips_foreign_print_matrix_get_type(void);
 2979|       |
 2980|      2|	extern GType vips_foreign_load_fits_file_get_type(void);
 2981|      2|	extern GType vips_foreign_load_fits_source_get_type(void);
 2982|      2|	extern GType vips_foreign_save_fits_get_type(void);
 2983|       |
 2984|      2|	extern GType vips_foreign_load_analyze_get_type(void);
 2985|       |
 2986|      2|	extern GType vips_foreign_load_openexr_get_type(void);
 2987|       |
 2988|      2|	extern GType vips_foreign_load_openslide_file_get_type(void);
 2989|      2|	extern GType vips_foreign_load_openslide_source_get_type(void);
 2990|       |
 2991|      2|	extern GType vips_foreign_load_vips_file_get_type(void);
 2992|      2|	extern GType vips_foreign_load_vips_source_get_type(void);
 2993|      2|	extern GType vips_foreign_save_vips_file_get_type(void);
 2994|      2|	extern GType vips_foreign_save_vips_target_get_type(void);
 2995|       |
 2996|      2|	extern GType vips_foreign_load_jpeg_file_get_type(void);
 2997|      2|	extern GType vips_foreign_load_jpeg_buffer_get_type(void);
 2998|      2|	extern GType vips_foreign_load_jpeg_source_get_type(void);
 2999|      2|	extern GType vips_foreign_save_jpeg_file_get_type(void);
 3000|      2|	extern GType vips_foreign_save_jpeg_buffer_get_type(void);
 3001|      2|	extern GType vips_foreign_save_jpeg_target_get_type(void);
 3002|      2|	extern GType vips_foreign_save_jpeg_mime_get_type(void);
 3003|       |
 3004|      2|	extern GType vips_foreign_load_tiff_file_get_type(void);
 3005|      2|	extern GType vips_foreign_load_tiff_buffer_get_type(void);
 3006|      2|	extern GType vips_foreign_load_tiff_source_get_type(void);
 3007|      2|	extern GType vips_foreign_save_tiff_file_get_type(void);
 3008|      2|	extern GType vips_foreign_save_tiff_buffer_get_type(void);
 3009|      2|	extern GType vips_foreign_save_tiff_target_get_type(void);
 3010|       |
 3011|      2|	extern GType vips_foreign_load_raw_get_type(void);
 3012|      2|	extern GType vips_foreign_save_raw_file_get_type(void);
 3013|      2|	extern GType vips_foreign_save_raw_buffer_get_type(void);
 3014|      2|	extern GType vips_foreign_save_raw_target_get_type(void);
 3015|       |
 3016|      2|	extern GType vips_foreign_load_magick_file_get_type(void);
 3017|      2|	extern GType vips_foreign_load_magick_buffer_get_type(void);
 3018|      2|	extern GType vips_foreign_load_magick7_file_get_type(void);
 3019|      2|	extern GType vips_foreign_load_magick7_buffer_get_type(void);
 3020|       |
 3021|      2|	extern GType vips_foreign_save_magick_file_get_type(void);
 3022|      2|	extern GType vips_foreign_save_magick_buffer_get_type(void);
 3023|      2|	extern GType vips_foreign_save_magick_bmp_file_get_type(void);
 3024|      2|	extern GType vips_foreign_save_magick_bmp_buffer_get_type(void);
 3025|      2|	extern GType vips_foreign_save_magick_gif_file_get_type(void);
 3026|      2|	extern GType vips_foreign_save_magick_gif_buffer_get_type(void);
 3027|       |
 3028|      2|	extern GType vips_foreign_save_dz_file_get_type(void);
 3029|      2|	extern GType vips_foreign_save_dz_buffer_get_type(void);
 3030|      2|	extern GType vips_foreign_save_dz_target_get_type(void);
 3031|       |
 3032|      2|	extern GType vips_foreign_load_webp_file_get_type(void);
 3033|      2|	extern GType vips_foreign_load_webp_buffer_get_type(void);
 3034|      2|	extern GType vips_foreign_load_webp_source_get_type(void);
 3035|      2|	extern GType vips_foreign_save_webp_file_get_type(void);
 3036|      2|	extern GType vips_foreign_save_webp_buffer_get_type(void);
 3037|      2|	extern GType vips_foreign_save_webp_target_get_type(void);
 3038|      2|	extern GType vips_foreign_save_webp_mime_get_type(void);
 3039|       |
 3040|      2|	extern GType vips_foreign_load_pdf_file_get_type(void);
 3041|      2|	extern GType vips_foreign_load_pdf_buffer_get_type(void);
 3042|      2|	extern GType vips_foreign_load_pdf_source_get_type(void);
 3043|       |
 3044|      2|	extern GType vips_foreign_load_svg_file_get_type(void);
 3045|      2|	extern GType vips_foreign_load_svg_buffer_get_type(void);
 3046|      2|	extern GType vips_foreign_load_svg_source_get_type(void);
 3047|       |
 3048|      2|	extern GType vips_foreign_load_jp2k_file_get_type(void);
 3049|      2|	extern GType vips_foreign_load_jp2k_buffer_get_type(void);
 3050|      2|	extern GType vips_foreign_load_jp2k_source_get_type(void);
 3051|      2|	extern GType vips_foreign_save_jp2k_file_get_type(void);
 3052|      2|	extern GType vips_foreign_save_jp2k_buffer_get_type(void);
 3053|      2|	extern GType vips_foreign_save_jp2k_target_get_type(void);
 3054|       |
 3055|      2|	extern GType vips_foreign_load_jxl_file_get_type(void);
 3056|      2|	extern GType vips_foreign_load_jxl_buffer_get_type(void);
 3057|      2|	extern GType vips_foreign_load_jxl_source_get_type(void);
 3058|      2|	extern GType vips_foreign_save_jxl_file_get_type(void);
 3059|      2|	extern GType vips_foreign_save_jxl_buffer_get_type(void);
 3060|      2|	extern GType vips_foreign_save_jxl_target_get_type(void);
 3061|       |
 3062|      2|	extern GType vips_foreign_load_heif_file_get_type(void);
 3063|      2|	extern GType vips_foreign_load_heif_buffer_get_type(void);
 3064|      2|	extern GType vips_foreign_load_heif_source_get_type(void);
 3065|      2|	extern GType vips_foreign_save_heif_file_get_type(void);
 3066|      2|	extern GType vips_foreign_save_heif_buffer_get_type(void);
 3067|      2|	extern GType vips_foreign_save_heif_target_get_type(void);
 3068|      2|	extern GType vips_foreign_save_avif_target_get_type(void);
 3069|       |
 3070|      2|	extern GType vips_foreign_load_nifti_file_get_type(void);
 3071|      2|	extern GType vips_foreign_load_nifti_source_get_type(void);
 3072|      2|	extern GType vips_foreign_save_nifti_get_type(void);
 3073|       |
 3074|      2|	extern GType vips_foreign_load_nsgif_file_get_type(void);
 3075|      2|	extern GType vips_foreign_load_nsgif_buffer_get_type(void);
 3076|      2|	extern GType vips_foreign_load_nsgif_source_get_type(void);
 3077|       |
 3078|      2|	extern GType vips_foreign_save_cgif_file_get_type(void);
 3079|      2|	extern GType vips_foreign_save_cgif_buffer_get_type(void);
 3080|      2|	extern GType vips_foreign_save_cgif_target_get_type(void);
 3081|       |
 3082|      2|	vips_foreign_load_csv_file_get_type();
 3083|      2|	vips_foreign_load_csv_source_get_type();
 3084|      2|	vips_foreign_save_csv_file_get_type();
 3085|      2|	vips_foreign_save_csv_target_get_type();
 3086|       |
 3087|      2|	vips_foreign_load_matrix_file_get_type();
 3088|      2|	vips_foreign_load_matrix_source_get_type();
 3089|      2|	vips_foreign_save_matrix_file_get_type();
 3090|      2|	vips_foreign_save_matrix_target_get_type();
 3091|      2|	vips_foreign_print_matrix_get_type();
 3092|       |
 3093|      2|	vips_foreign_load_raw_get_type();
 3094|      2|	vips_foreign_save_raw_file_get_type();
 3095|      2|	vips_foreign_save_raw_buffer_get_type();
 3096|      2|	vips_foreign_save_raw_target_get_type();
 3097|       |
 3098|      2|	vips_foreign_load_vips_file_get_type();
 3099|      2|	vips_foreign_load_vips_source_get_type();
 3100|      2|	vips_foreign_save_vips_file_get_type();
 3101|      2|	vips_foreign_save_vips_target_get_type();
 3102|       |
 3103|      2|#ifdef HAVE_ANALYZE
 3104|      2|	vips_foreign_load_analyze_get_type();
 3105|      2|#endif /*HAVE_ANALYZE*/
 3106|       |
 3107|      2|#ifdef HAVE_PPM
 3108|      2|	vips_foreign_load_ppm_file_get_type();
 3109|      2|	vips_foreign_load_ppm_source_get_type();
 3110|      2|	vips_foreign_save_ppm_file_get_type();
 3111|      2|	vips_foreign_save_pbm_target_get_type();
 3112|      2|	vips_foreign_save_pgm_target_get_type();
 3113|      2|	vips_foreign_save_ppm_target_get_type();
 3114|      2|	vips_foreign_save_pfm_target_get_type();
 3115|      2|	vips_foreign_save_pnm_target_get_type();
 3116|      2|#endif /*HAVE_PPM*/
 3117|       |
 3118|      2|#ifdef HAVE_RADIANCE
 3119|      2|	vips_foreign_load_rad_file_get_type();
 3120|      2|	vips_foreign_load_rad_buffer_get_type();
 3121|      2|	vips_foreign_load_rad_source_get_type();
 3122|      2|	vips_foreign_save_rad_file_get_type();
 3123|      2|	vips_foreign_save_rad_buffer_get_type();
 3124|      2|	vips_foreign_save_rad_target_get_type();
 3125|      2|#endif /*HAVE_RADIANCE*/
 3126|       |
 3127|       |#if defined(HAVE_POPPLER) && !defined(POPPLER_MODULE)
 3128|       |	vips_foreign_load_pdf_file_get_type();
 3129|       |	vips_foreign_load_pdf_buffer_get_type();
 3130|       |	vips_foreign_load_pdf_source_get_type();
 3131|       |#endif /*defined(HAVE_POPPLER) && !defined(POPPLER_MODULE)*/
 3132|       |
 3133|      2|#ifdef HAVE_PDFIUM
 3134|      2|	vips_foreign_load_pdf_file_get_type();
 3135|      2|	vips_foreign_load_pdf_buffer_get_type();
 3136|      2|	vips_foreign_load_pdf_source_get_type();
 3137|      2|#endif /*HAVE_PDFIUM*/
 3138|       |
 3139|       |#ifdef HAVE_RSVG
 3140|       |	vips_foreign_load_svg_file_get_type();
 3141|       |	vips_foreign_load_svg_buffer_get_type();
 3142|       |	vips_foreign_load_svg_source_get_type();
 3143|       |#endif /*HAVE_RSVG*/
 3144|       |
 3145|       |#if defined(HAVE_LIBJXL) && !defined(LIBJXL_MODULE)
 3146|       |	vips_foreign_load_jxl_file_get_type();
 3147|       |	vips_foreign_load_jxl_buffer_get_type();
 3148|       |	vips_foreign_load_jxl_source_get_type();
 3149|       |	vips_foreign_save_jxl_file_get_type();
 3150|       |	vips_foreign_save_jxl_buffer_get_type();
 3151|       |	vips_foreign_save_jxl_target_get_type();
 3152|       |#endif /*defined(HAVE_LIBJXL) && !defined(LIBJXL_MODULE)*/
 3153|       |
 3154|       |#ifdef HAVE_LIBOPENJP2
 3155|       |	vips_foreign_load_jp2k_file_get_type();
 3156|       |	vips_foreign_load_jp2k_buffer_get_type();
 3157|       |	vips_foreign_load_jp2k_source_get_type();
 3158|       |	vips_foreign_save_jp2k_file_get_type();
 3159|       |	vips_foreign_save_jp2k_buffer_get_type();
 3160|       |	vips_foreign_save_jp2k_target_get_type();
 3161|       |#endif /*HAVE_LIBOPENJP2*/
 3162|       |
 3163|      2|#ifdef HAVE_NSGIF
 3164|      2|	vips_foreign_load_nsgif_file_get_type();
 3165|      2|	vips_foreign_load_nsgif_buffer_get_type();
 3166|      2|	vips_foreign_load_nsgif_source_get_type();
 3167|      2|#endif /*HAVE_NSGIF*/
 3168|       |
 3169|      2|#ifdef HAVE_CGIF
 3170|      2|	vips_foreign_save_cgif_file_get_type();
 3171|      2|	vips_foreign_save_cgif_buffer_get_type();
 3172|      2|	vips_foreign_save_cgif_target_get_type();
 3173|      2|#endif /*HAVE_CGIF*/
 3174|       |
 3175|       |#ifdef HAVE_LIBARCHIVE
 3176|       |	vips_foreign_save_dz_file_get_type();
 3177|       |	vips_foreign_save_dz_buffer_get_type();
 3178|       |	vips_foreign_save_dz_target_get_type();
 3179|       |#endif /*HAVE_LIBARCHIVE*/
 3180|       |
 3181|       |#ifdef HAVE_PNG
 3182|       |	vips_foreign_load_png_file_get_type();
 3183|       |	vips_foreign_load_png_buffer_get_type();
 3184|       |	vips_foreign_load_png_source_get_type();
 3185|       |	vips_foreign_save_png_file_get_type();
 3186|       |	vips_foreign_save_png_buffer_get_type();
 3187|       |	vips_foreign_save_png_target_get_type();
 3188|       |#endif /*HAVE_PNG*/
 3189|       |
 3190|      2|#ifdef HAVE_SPNG
 3191|      2|	vips_foreign_load_png_file_get_type();
 3192|      2|	vips_foreign_load_png_buffer_get_type();
 3193|      2|	vips_foreign_load_png_source_get_type();
 3194|      2|	vips_foreign_save_spng_file_get_type();
 3195|      2|	vips_foreign_save_spng_buffer_get_type();
 3196|      2|	vips_foreign_save_spng_target_get_type();
 3197|      2|#endif /*HAVE_SPNG*/
 3198|       |
 3199|       |#ifdef HAVE_MATIO
 3200|       |	vips_foreign_load_mat_get_type();
 3201|       |#endif /*HAVE_MATIO*/
 3202|       |
 3203|      2|#ifdef HAVE_JPEG
 3204|      2|	vips_foreign_load_jpeg_file_get_type();
 3205|      2|	vips_foreign_load_jpeg_buffer_get_type();
 3206|      2|	vips_foreign_load_jpeg_source_get_type();
 3207|      2|	vips_foreign_save_jpeg_file_get_type();
 3208|      2|	vips_foreign_save_jpeg_buffer_get_type();
 3209|      2|	vips_foreign_save_jpeg_target_get_type();
 3210|      2|	vips_foreign_save_jpeg_mime_get_type();
 3211|      2|#endif /*HAVE_JPEG*/
 3212|       |
 3213|      2|#ifdef HAVE_LIBWEBP
 3214|      2|	vips_foreign_load_webp_file_get_type();
 3215|      2|	vips_foreign_load_webp_buffer_get_type();
 3216|      2|	vips_foreign_load_webp_source_get_type();
 3217|      2|	vips_foreign_save_webp_file_get_type();
 3218|      2|	vips_foreign_save_webp_buffer_get_type();
 3219|      2|	vips_foreign_save_webp_target_get_type();
 3220|      2|	vips_foreign_save_webp_mime_get_type();
 3221|      2|#endif /*HAVE_LIBWEBP*/
 3222|       |
 3223|      2|#ifdef HAVE_TIFF
 3224|      2|	vips_foreign_load_tiff_file_get_type();
 3225|      2|	vips_foreign_load_tiff_buffer_get_type();
 3226|      2|	vips_foreign_load_tiff_source_get_type();
 3227|      2|	vips_foreign_save_tiff_file_get_type();
 3228|      2|	vips_foreign_save_tiff_buffer_get_type();
 3229|      2|	vips_foreign_save_tiff_target_get_type();
 3230|      2|#endif /*HAVE_TIFF*/
 3231|       |
 3232|       |#if defined(HAVE_OPENSLIDE) && !defined(OPENSLIDE_MODULE)
 3233|       |	vips_foreign_load_openslide_file_get_type();
 3234|       |	vips_foreign_load_openslide_source_get_type();
 3235|       |#endif /*defined(HAVE_OPENSLIDE) && !defined(OPENSLIDE_MODULE)*/
 3236|       |
 3237|       |#if defined(ENABLE_MAGICKLOAD) && !defined(MAGICK_MODULE)
 3238|       |#ifdef HAVE_MAGICK6
 3239|       |	vips_foreign_load_magick_file_get_type();
 3240|       |	vips_foreign_load_magick_buffer_get_type();
 3241|       |#endif /*HAVE_MAGICK6*/
 3242|       |
 3243|       |#ifdef HAVE_MAGICK7
 3244|       |	vips_foreign_load_magick7_file_get_type();
 3245|       |	vips_foreign_load_magick7_buffer_get_type();
 3246|       |#endif /*HAVE_MAGICK7*/
 3247|       |#endif /*defined(ENABLE_MAGICKLOAD) && !defined(MAGICK_MODULE)*/
 3248|       |
 3249|       |#if defined(ENABLE_MAGICKSAVE) && !defined(MAGICK_MODULE)
 3250|       |	vips_foreign_save_magick_file_get_type();
 3251|       |	vips_foreign_save_magick_buffer_get_type();
 3252|       |	vips_foreign_save_magick_bmp_file_get_type();
 3253|       |	vips_foreign_save_magick_bmp_buffer_get_type();
 3254|       |	vips_foreign_save_magick_gif_file_get_type();
 3255|       |	vips_foreign_save_magick_gif_buffer_get_type();
 3256|       |#endif /*defined(ENABLE_MAGICKSAVE) && !defined(MAGICK_MODULE)*/
 3257|       |
 3258|       |#ifdef HAVE_CFITSIO
 3259|       |	vips_foreign_load_fits_file_get_type();
 3260|       |	vips_foreign_load_fits_source_get_type();
 3261|       |	vips_foreign_save_fits_get_type();
 3262|       |#endif /*HAVE_CFITSIO*/
 3263|       |
 3264|       |#ifdef HAVE_OPENEXR
 3265|       |	vips_foreign_load_openexr_get_type();
 3266|       |#endif /*HAVE_OPENEXR*/
 3267|       |
 3268|       |#ifdef HAVE_NIFTI
 3269|       |	vips_foreign_load_nifti_file_get_type();
 3270|       |	vips_foreign_load_nifti_source_get_type();
 3271|       |	vips_foreign_save_nifti_get_type();
 3272|       |#endif /*HAVE_NIFTI*/
 3273|       |
 3274|      2|#if defined(HAVE_HEIF) && !defined(HEIF_MODULE)
 3275|      2|	vips_foreign_load_heif_file_get_type();
 3276|      2|	vips_foreign_load_heif_buffer_get_type();
 3277|      2|	vips_foreign_load_heif_source_get_type();
 3278|      2|	vips_foreign_save_heif_file_get_type();
 3279|      2|	vips_foreign_save_heif_buffer_get_type();
 3280|      2|	vips_foreign_save_heif_target_get_type();
 3281|      2|	vips_foreign_save_avif_target_get_type();
 3282|      2|#endif /*defined(HAVE_HEIF) && !defined(HEIF_MODULE)*/
 3283|       |
 3284|      2|	vips__foreign_load_operation =
 3285|      2|		g_quark_from_static_string("vips-foreign-load-operation");
 3286|      2|}
foreign.c:vips_foreign_class_init:
  400|      1|{
  401|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  402|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  403|       |
  404|      1|	gobject_class->set_property = vips_object_set_property;
  405|      1|	gobject_class->get_property = vips_object_get_property;
  406|       |
  407|      1|	object_class->nickname = "foreign";
  408|      1|	object_class->description = _("load and save image files");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  409|      1|	object_class->summary_class = vips_foreign_summary_class;
  410|      1|}
foreign.c:vips_foreign_init:
  414|  25.6k|{
  415|  25.6k|}
foreign.c:file_add_class:
  423|  1.00M|{
  424|  1.00M|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|  1.00M|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|  1.00M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.00M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|  1.00M|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  425|       |
  426|       |	// don't consider blocked classes ... we don't want eg. sniffers to run
  427|  1.00M|	if (operation_class->flags & VIPS_OPERATION_BLOCKED)
  ------------------
  |  Branch (427:6): [True: 0, False: 1.00M]
  ------------------
  428|      0|		return NULL;
  429|       |
  430|       |	// exclude "rawload" as it has a different API.
  431|  1.00M|	if (vips_isprefix("rawload", VIPS_OBJECT_CLASS(class)->nickname))
  ------------------
  |  |  435|  1.00M|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.00M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.00M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (431:6): [True: 16.7k, False: 989k]
  ------------------
  432|  16.7k|		return NULL;
  433|       |
  434|       |	/* Append so we don't reverse the list of files. Sort will
  435|       |	 * not reorder items of equal priority.
  436|       |	 */
  437|   989k|	*files = g_slist_append(*files, class);
  438|       |
  439|   989k|	return NULL;
  440|  1.00M|}
foreign.c:file_compare:
  444|  2.90M|{
  445|  2.90M|	return b->priority - a->priority;
  446|  2.90M|}
foreign.c:vips_foreign_load_class_init:
 1199|      1|{
 1200|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1201|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1202|      1|	VipsOperationClass *operation_class = (VipsOperationClass *) class;
 1203|       |
 1204|      1|	gobject_class->dispose = vips_foreign_load_dispose;
 1205|      1|	gobject_class->set_property = vips_object_set_property;
 1206|      1|	gobject_class->get_property = vips_object_get_property;
 1207|       |
 1208|      1|	object_class->build = vips_foreign_load_build;
 1209|      1|	object_class->summary_class = vips_foreign_load_summary_class;
 1210|      1|	object_class->new_from_string = vips_foreign_load_new_from_string;
 1211|      1|	object_class->nickname = "load";
 1212|      1|	object_class->description = _("loaders");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1213|       |
 1214|      1|	operation_class->get_flags = vips_foreign_load_operation_get_flags;
 1215|       |
 1216|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
 1217|      1|		_("Output"),
 1218|      1|		_("Output image"),
 1219|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
 1220|      1|		G_STRUCT_OFFSET(VipsForeignLoad, out));
 1221|       |
 1222|      1|	VIPS_ARG_FLAGS(class, "flags", 106,
  ------------------
  |  |  226|      1|	{ \
  |  |  227|      1|		GParamSpec *pspec; \
  |  |  228|      1|\
  |  |  229|      1|		pspec = g_param_spec_flags((NAME), (LONG), (DESC), \
  |  |  230|      1|			(TYPE), (VALUE), \
  |  |  231|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  232|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  233|      1|			vips_argument_get_id(), pspec); \
  |  |  234|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  235|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  236|      1|	}
  ------------------
 1223|      1|		_("Flags"),
 1224|      1|		_("Flags for this file"),
 1225|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
 1226|      1|		G_STRUCT_OFFSET(VipsForeignLoad, flags),
 1227|      1|		VIPS_TYPE_FOREIGN_FLAGS, VIPS_FOREIGN_NONE);
 1228|       |
 1229|      1|	VIPS_ARG_BOOL(class, "memory", 107,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1230|      1|		_("Memory"),
 1231|      1|		_("Force open via memory"),
 1232|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1233|      1|		G_STRUCT_OFFSET(VipsForeignLoad, memory),
 1234|      1|		FALSE);
 1235|       |
 1236|      1|	VIPS_ARG_ENUM(class, "access", 108,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
 1237|      1|		_("Access"),
 1238|      1|		_("Required access pattern for this file"),
 1239|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1240|      1|		G_STRUCT_OFFSET(VipsForeignLoad, access),
 1241|      1|		VIPS_TYPE_ACCESS, VIPS_ACCESS_RANDOM);
 1242|       |
 1243|      1|	VIPS_ARG_ENUM(class, "fail_on", 109,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
 1244|      1|		_("Fail on"),
 1245|      1|		_("Error level to fail on"),
 1246|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1247|      1|		G_STRUCT_OFFSET(VipsForeignLoad, fail_on),
 1248|      1|		VIPS_TYPE_FAIL_ON, VIPS_FAIL_ON_NONE);
 1249|       |
 1250|      1|	VIPS_ARG_BOOL(class, "revalidate", 110,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1251|      1|		_("Revalidate"),
 1252|      1|		_("Don't use a cached result for this operation"),
 1253|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_NON_HASHABLE,
 1254|      1|		G_STRUCT_OFFSET(VipsForeignLoad, revalidate),
 1255|      1|		FALSE);
 1256|       |
 1257|      1|	VIPS_ARG_BOOL(class, "sequential", 111,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1258|      1|		_("Sequential"),
 1259|      1|		_("Sequential read only"),
 1260|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
 1261|      1|		G_STRUCT_OFFSET(VipsForeignLoad, sequential),
 1262|      1|		FALSE);
 1263|       |
 1264|      1|	VIPS_ARG_BOOL(class, "fail", 112,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1265|      1|		_("Fail"),
 1266|      1|		_("Fail on first warning"),
 1267|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
 1268|      1|		G_STRUCT_OFFSET(VipsForeignLoad, fail),
 1269|      1|		FALSE);
 1270|       |
 1271|      1|	VIPS_ARG_BOOL(class, "disc", 113,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1272|      1|		_("Disc"),
 1273|      1|		_("Open to disc"),
 1274|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
 1275|      1|		G_STRUCT_OFFSET(VipsForeignLoad, disc),
 1276|      1|		TRUE);
 1277|      1|}
foreign.c:vips_foreign_load_dispose:
  503|  14.7k|{
  504|  14.7k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(gobject);
  ------------------
  |  |  133|  14.7k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  14.7k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  14.7k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  14.7k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
  505|       |
  506|  14.7k|	VIPS_UNREF(load->real);
  ------------------
  |  |   57|  14.7k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  14.7k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  14.7k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  14.7k|	{ \
  |  |  |  |   43|  14.7k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 10.9k, False: 3.83k]
  |  |  |  |  ------------------
  |  |  |  |   44|  10.9k|			(void) F((S)); \
  |  |  |  |   45|  10.9k|			(S) = 0; \
  |  |  |  |   46|  10.9k|		} \
  |  |  |  |   47|  14.7k|	} \
  |  |  |  |   48|  14.7k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  14.7k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  507|       |
  508|  14.7k|	G_OBJECT_CLASS(vips_foreign_load_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  14.7k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  14.7k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  14.7k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  509|  14.7k|}
foreign.c:vips_foreign_load_build:
 1079|  14.1k|{
 1080|  14.1k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  14.1k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  14.1k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  14.1k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1081|  14.1k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(object);
  ------------------
  |  |  133|  14.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  14.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  14.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  14.1k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
 1082|  14.1k|	VipsForeignLoadClass *fclass = VIPS_FOREIGN_LOAD_GET_CLASS(object);
  ------------------
  |  |  143|  14.1k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  14.1k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  14.1k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|  14.1k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoadClass))
  ------------------
 1083|       |
 1084|  14.1k|	VipsForeignFlags flags;
 1085|       |
 1086|       |#ifdef DEBUG
 1087|       |	printf("vips_foreign_load_build:\n");
 1088|       |#endif /*DEBUG*/
 1089|       |
 1090|  14.1k|	flags = 0;
 1091|  14.1k|	if (fclass->get_flags)
  ------------------
  |  Branch (1091:6): [True: 14.1k, False: 0]
  ------------------
 1092|  14.1k|		flags |= fclass->get_flags(load);
 1093|       |
 1094|  14.1k|	if ((flags & VIPS_FOREIGN_PARTIAL) &&
  ------------------
  |  Branch (1094:6): [True: 1.23k, False: 12.9k]
  ------------------
 1095|  14.1k|		(flags & VIPS_FOREIGN_SEQUENTIAL)) {
  ------------------
  |  Branch (1095:3): [True: 0, False: 1.23k]
  ------------------
 1096|      0|		g_warning("%s",
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1097|      0|			_("VIPS_FOREIGN_PARTIAL and VIPS_FOREIGN_SEQUENTIAL "
 1098|      0|			  "both set -- using SEQUENTIAL"));
 1099|      0|		flags ^= VIPS_FOREIGN_PARTIAL;
 1100|      0|	}
 1101|       |
 1102|  14.1k|	g_object_set(load, "flags", flags, NULL);
 1103|       |
 1104|       |	/* We must block caching of seq loaders running in seq mode. A seq
 1105|       |	 * loader in random mode is fine, since we'll read to ram or a temp
 1106|       |	 * file.
 1107|       |	 */
 1108|  14.1k|	if ((load->flags & VIPS_FOREIGN_SEQUENTIAL) &&
  ------------------
  |  Branch (1108:6): [True: 11.9k, False: 2.21k]
  ------------------
 1109|  14.1k|		load->access != VIPS_ACCESS_RANDOM)
  ------------------
  |  Branch (1109:3): [True: 0, False: 11.9k]
  ------------------
 1110|      0|		load->nocache = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1111|       |
 1112|       |	/* The deprecated "fail" field sets fail_on warning.
 1113|       |	 */
 1114|  14.1k|	if (vips_object_argument_isset(object, "fail") &&
  ------------------
  |  Branch (1114:6): [True: 0, False: 14.1k]
  ------------------
 1115|  14.1k|		!vips_object_argument_isset(object, "fail_on"))
  ------------------
  |  Branch (1115:3): [True: 0, False: 0]
  ------------------
 1116|      0|		load->fail_on = load->fail
  ------------------
  |  Branch (1116:19): [True: 0, False: 0]
  ------------------
 1117|      0|			? VIPS_FAIL_ON_WARNING
 1118|      0|			: VIPS_FAIL_ON_NONE;
 1119|       |
 1120|  14.1k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_parent_class)->build(object))
  ------------------
  |  |  435|  14.1k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  14.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  14.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1120:6): [True: 0, False: 14.1k]
  ------------------
 1121|      0|		return -1;
 1122|       |
 1123|  14.1k|	if (load->sequential)
  ------------------
  |  Branch (1123:6): [True: 0, False: 14.1k]
  ------------------
 1124|      0|		g_warning("%s",
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1125|  14.1k|			_("ignoring deprecated \"sequential\" mode -- "
 1126|  14.1k|			  "please use \"access\" instead"));
 1127|       |
 1128|  14.1k|	g_object_set(object, "out", vips_image_new(), NULL);
 1129|       |
 1130|  14.1k|	vips_image_set_string(load->out,
 1131|  14.1k|		VIPS_META_LOADER, class->nickname);
  ------------------
  |  |  115|  14.1k|#define VIPS_META_LOADER "vips-loader"
  ------------------
 1132|       |
 1133|       |#ifdef DEBUG
 1134|       |	printf("vips_foreign_load_build: triggering ->header()\n");
 1135|       |#endif /*DEBUG*/
 1136|       |
 1137|       |	/* Read the header into @out.
 1138|       |	 */
 1139|  14.1k|	if (fclass->header &&
  ------------------
  |  Branch (1139:6): [True: 14.1k, False: 0]
  ------------------
 1140|  14.1k|		fclass->header(load))
  ------------------
  |  Branch (1140:3): [True: 2.68k, False: 11.4k]
  ------------------
 1141|  2.68k|		return -1;
 1142|       |
 1143|       |	/* If there's no ->load() method then the header read has done
 1144|       |	 * everything. Otherwise, it's just set fields and we must also
 1145|       |	 * load pixels.
 1146|       |	 *
 1147|       |	 * Delay the load until the first pixel is requested by doing the work
 1148|       |	 * in the start function of the copy.
 1149|       |	 */
 1150|  11.4k|	if (fclass->load) {
  ------------------
  |  Branch (1150:6): [True: 11.4k, False: 0]
  ------------------
 1151|       |#ifdef DEBUG
 1152|       |		printf("vips_foreign_load_build: delaying read ...\n");
 1153|       |#endif /*DEBUG*/
 1154|       |
 1155|       |		/* ->header() should set the dhint. It'll default to the safe
 1156|       |		 * SMALLTILE if header() did not set it.
 1157|       |		 */
 1158|  11.4k|		if (vips_image_pipelinev(load->out, load->out->dhint, NULL))
  ------------------
  |  Branch (1158:7): [True: 0, False: 11.4k]
  ------------------
 1159|      0|			return -1;
 1160|       |
 1161|       |		/* Then 'start' creates the real image and 'gen' fetches
 1162|       |		 * pixels for @out from @real on demand.
 1163|       |		 */
 1164|  11.4k|		if (vips_image_generate(load->out,
  ------------------
  |  Branch (1164:7): [True: 0, False: 11.4k]
  ------------------
 1165|  11.4k|				vips_foreign_load_start,
 1166|  11.4k|				vips_foreign_load_generate,
 1167|  11.4k|				vips_stop_one,
 1168|  11.4k|				NULL, load))
 1169|      0|			return -1;
 1170|  11.4k|	}
 1171|       |
 1172|       |	/* Tell downstream if seq mode was requested.
 1173|       |	 */
 1174|  11.4k|	if (load->access != VIPS_ACCESS_RANDOM)
  ------------------
  |  Branch (1174:6): [True: 0, False: 11.4k]
  ------------------
 1175|      0|		vips_image_set_int(load->out, VIPS_META_SEQUENTIAL, 1);
  ------------------
  |  |  124|      0|#define VIPS_META_SEQUENTIAL "vips-sequential"
  ------------------
 1176|       |
 1177|  11.4k|	return 0;
 1178|  11.4k|}
foreign.c:vips_foreign_load_start:
  991|  14.1k|{
  992|  14.1k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(b);
  ------------------
  |  |  133|  14.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  14.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  14.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  14.1k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
  993|  14.1k|	VipsForeignLoadClass *class = VIPS_FOREIGN_LOAD_GET_CLASS(load);
  ------------------
  |  |  143|  14.1k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  14.1k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  14.1k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|  14.1k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoadClass))
  ------------------
  994|       |
  995|       |	/* If this start has failed before in another thread, we can fail now.
  996|       |	 */
  997|  14.1k|	if (load->error)
  ------------------
  |  Branch (997:6): [True: 0, False: 14.1k]
  ------------------
  998|      0|		return NULL;
  999|       |
 1000|  14.1k|	if (!load->real) {
  ------------------
  |  Branch (1000:6): [True: 10.9k, False: 3.18k]
  ------------------
 1001|  10.9k|		if (!(load->real = vips_foreign_load_temp(load)))
  ------------------
  |  Branch (1001:7): [True: 0, False: 10.9k]
  ------------------
 1002|      0|			return NULL;
 1003|       |
 1004|       |#ifdef DEBUG
 1005|       |		printf("vips_foreign_load_start: triggering ->load()\n");
 1006|       |#endif /*DEBUG*/
 1007|       |
 1008|       |		/* Read the image in. This may involve a long computation and
 1009|       |		 * will finish with load->real holding the decompressed image.
 1010|       |		 *
 1011|       |		 * We want our caller to be able to see this computation on
 1012|       |		 * @out, so eval signals on ->real need to appear on ->out.
 1013|       |		 */
 1014|  10.9k|		load->real->progress_signal = load->out;
 1015|       |
 1016|       |		/* Note the load object on the image. Loaders can use
 1017|       |		 * this to signal invalidate if they hit a load error. See
 1018|       |		 * vips_foreign_load_invalidate() below.
 1019|       |		 */
 1020|  10.9k|		g_object_set_qdata(G_OBJECT(load->real),
  ------------------
  |  |   51|  10.9k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  10.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1021|  10.9k|			vips__foreign_load_operation, load);
 1022|       |
 1023|       |		/* Load the image and check the result.
 1024|       |		 *
 1025|       |		 * ->header() read the header into @out, load will read the
 1026|       |		 * image into @real. They must match exactly in size, bands,
 1027|       |		 * format and coding for the copy to work.
 1028|       |		 *
 1029|       |		 * Some versions of ImageMagick give different results between
 1030|       |		 * Ping and Load for some formats, for example.
 1031|       |		 *
 1032|       |		 * If the load fails, we need to stop.
 1033|       |		 */
 1034|  10.9k|		if (class->load(load) ||
  ------------------
  |  Branch (1034:7): [True: 6.83k, False: 4.08k]
  ------------------
 1035|  10.9k|			vips_image_pio_input(load->real) ||
  ------------------
  |  Branch (1035:4): [True: 0, False: 4.08k]
  ------------------
 1036|  10.9k|			!vips_foreign_load_iscompat(load->real, out)) {
  ------------------
  |  Branch (1036:4): [True: 1, False: 4.08k]
  ------------------
 1037|  6.83k|			vips_operation_invalidate(VIPS_OPERATION(load));
  ------------------
  |  |   57|  6.83k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  6.83k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  6.83k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|  6.83k|		VIPS_TYPE_OPERATION, VipsOperation))
  ------------------
 1038|  6.83k|			load->error = TRUE;
  ------------------
  |  |  798|  6.83k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  6.83k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1039|       |
 1040|  6.83k|			return NULL;
 1041|  6.83k|		}
 1042|       |
 1043|       |		/* We have to tell vips that out depends on real. We've set
 1044|       |		 * the demand hint below, but not given an input there.
 1045|       |		 */
 1046|  4.08k|		if (vips_image_pipelinev(load->out, load->out->dhint,
  ------------------
  |  Branch (1046:7): [True: 0, False: 4.08k]
  ------------------
 1047|  4.08k|				load->real, NULL))
 1048|      0|			return NULL;
 1049|  4.08k|	}
 1050|       |
 1051|  7.26k|	return vips_region_new(load->real);
 1052|  14.1k|}
foreign.c:vips_foreign_load_temp:
  908|  10.9k|{
  909|  10.9k|	const guint64 disc_threshold = vips_get_disc_threshold();
  910|  10.9k|	const guint64 image_size = VIPS_IMAGE_SIZEOF_IMAGE(load->out);
  ------------------
  |  |  388|  10.9k|	(VIPS_IMAGE_SIZEOF_LINE(I) * (I)->Ysize)
  |  |  ------------------
  |  |  |  |  386|  10.9k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  10.9k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  10.9k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  911|       |
  912|       |	/* ->memory used to be called ->disc and default TRUE. If it's been
  913|       |	 * forced FALSE, set memory TRUE.
  914|       |	 */
  915|  10.9k|	if (!load->disc)
  ------------------
  |  Branch (915:6): [True: 0, False: 10.9k]
  ------------------
  916|      0|		load->memory = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  917|       |
  918|  10.9k|	if (load->memory) {
  ------------------
  |  Branch (918:6): [True: 0, False: 10.9k]
  ------------------
  919|       |#ifdef DEBUG
  920|       |		printf("vips_foreign_load_temp: forced memory temp\n");
  921|       |#endif /*DEBUG*/
  922|       |
  923|      0|		return vips_image_new_memory();
  924|      0|	}
  925|       |
  926|       |	/* If this is a partial operation, we can open directly.
  927|       |	 */
  928|  10.9k|	if (load->flags & VIPS_FOREIGN_PARTIAL) {
  ------------------
  |  Branch (928:6): [True: 949, False: 9.97k]
  ------------------
  929|       |#ifdef DEBUG
  930|       |		printf("vips_foreign_load_temp: partial temp\n");
  931|       |#endif /*DEBUG*/
  932|       |
  933|    949|		return vips_image_new();
  934|    949|	}
  935|       |
  936|       |	/* If it can do sequential access and it's been requested, we can open
  937|       |	 * directly.
  938|       |	 */
  939|  9.97k|	if ((load->flags & VIPS_FOREIGN_SEQUENTIAL) &&
  ------------------
  |  Branch (939:6): [True: 9.22k, False: 749]
  ------------------
  940|  9.97k|		load->access != VIPS_ACCESS_RANDOM) {
  ------------------
  |  Branch (940:3): [True: 0, False: 9.22k]
  ------------------
  941|       |#ifdef DEBUG
  942|       |		printf("vips_foreign_load_temp: partial sequential temp\n");
  943|       |#endif /*DEBUG*/
  944|       |
  945|      0|		return vips_image_new();
  946|      0|	}
  947|       |
  948|       |	/* We open via disc if the uncompressed image will be larger than
  949|       |	 * vips_get_disc_threshold()
  950|       |	 */
  951|  9.97k|	if (image_size > disc_threshold) {
  ------------------
  |  Branch (951:6): [True: 0, False: 9.97k]
  ------------------
  952|       |#ifdef DEBUG
  953|       |		printf("vips_foreign_load_temp: disc temp\n");
  954|       |#endif /*DEBUG*/
  955|       |
  956|      0|		return vips_image_new_temp_file("%s.v");
  957|      0|	}
  958|       |
  959|       |#ifdef DEBUG
  960|       |	printf("vips_foreign_load_temp: fallback memory temp\n");
  961|       |#endif /*DEBUG*/
  962|       |
  963|       |	/* Otherwise, fall back to a memory buffer.
  964|       |	 */
  965|  9.97k|	return vips_image_new_memory();
  966|  9.97k|}
foreign.c:vips_foreign_load_iscompat:
  972|  4.08k|{
  973|  4.08k|	if (a->Xsize != b->Xsize ||
  ------------------
  |  Branch (973:6): [True: 0, False: 4.08k]
  ------------------
  974|  4.08k|		a->Ysize != b->Ysize ||
  ------------------
  |  Branch (974:3): [True: 0, False: 4.08k]
  ------------------
  975|  4.08k|		a->Bands != b->Bands ||
  ------------------
  |  Branch (975:3): [True: 1, False: 4.08k]
  ------------------
  976|  4.08k|		a->Coding != b->Coding ||
  ------------------
  |  Branch (976:3): [True: 0, False: 4.08k]
  ------------------
  977|  4.08k|		a->BandFmt != b->BandFmt) {
  ------------------
  |  Branch (977:3): [True: 0, False: 4.08k]
  ------------------
  978|      1|		vips_error("VipsForeignLoad", "%s",
  979|      1|			_("images do not match between header and load"));
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  980|      1|		return FALSE;
  ------------------
  |  |  794|      1|#define	FALSE	(0)
  ------------------
  981|      1|	}
  982|       |
  983|  4.08k|	return TRUE;
  ------------------
  |  |  798|  4.08k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  4.08k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  984|  4.08k|}
foreign.c:vips_foreign_load_generate:
 1059|  23.1k|{
 1060|  23.1k|	VipsRegion *ir = (VipsRegion *) seq;
 1061|       |
 1062|  23.1k|	VipsRect *r = &out_region->valid;
 1063|       |
 1064|       |	/* Ask for input we need.
 1065|       |	 */
 1066|  23.1k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (1066:6): [True: 55, False: 23.1k]
  ------------------
 1067|     55|		return -1;
 1068|       |
 1069|       |	/* Attach output region to that.
 1070|       |	 */
 1071|  23.1k|	if (vips_region_region(out_region, ir, r, r->left, r->top))
  ------------------
  |  Branch (1071:6): [True: 0, False: 23.1k]
  ------------------
 1072|      0|		return -1;
 1073|       |
 1074|  23.1k|	return 0;
 1075|  23.1k|}
foreign.c:vips_foreign_load_operation_get_flags:
 1182|  26.2k|{
 1183|  26.2k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(operation);
  ------------------
  |  |  133|  26.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  26.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  26.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  26.2k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
 1184|       |
 1185|  26.2k|	VipsOperationFlags flags;
 1186|       |
 1187|  26.2k|	flags = VIPS_OPERATION_CLASS(vips_foreign_load_parent_class)
  ------------------
  |  |   60|  26.2k|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|  26.2k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  26.2k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|  26.2k|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
 1188|  26.2k|				->get_flags(operation);
 1189|  26.2k|	if (load->nocache)
  ------------------
  |  Branch (1189:6): [True: 0, False: 26.2k]
  ------------------
 1190|      0|		flags |= VIPS_OPERATION_NOCACHE;
 1191|  26.2k|	if (load->revalidate)
  ------------------
  |  Branch (1191:6): [True: 0, False: 26.2k]
  ------------------
 1192|      0|		flags |= VIPS_OPERATION_REVALIDATE;
 1193|       |
 1194|  26.2k|	return flags;
 1195|  26.2k|}
foreign.c:vips_foreign_load_init:
 1281|  14.7k|{
 1282|  14.7k|	load->disc = TRUE;
  ------------------
  |  |  798|  14.7k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  14.7k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1283|  14.7k|	load->access = VIPS_ACCESS_RANDOM;
 1284|  14.7k|	load->fail_on = VIPS_FAIL_ON_NONE;
 1285|  14.7k|}
foreign.c:vips_foreign_find_load_buffer_sub:
  663|   341k|{
  664|   341k|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(load_class);
  ------------------
  |  |  435|   341k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   341k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   341k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  665|       |
  666|       |	/* Skip non-buffer loaders.
  667|       |	 */
  668|   341k|	if (!g_str_has_suffix(object_class->nickname, "_buffer"))
  ------------------
  |  Branch (668:6): [True: 254k, False: 87.2k]
  ------------------
  669|   254k|		return NULL;
  670|       |
  671|  87.2k|	if (load_class->is_a_buffer) {
  ------------------
  |  Branch (671:6): [True: 87.2k, False: 0]
  ------------------
  672|  87.2k|		if (load_class->is_a_buffer(*buf, *len))
  ------------------
  |  Branch (672:7): [True: 14.7k, False: 72.5k]
  ------------------
  673|  14.7k|			return load_class;
  674|  87.2k|	}
  675|      0|	else
  676|      0|		g_warning("loader %s has no is_a_buffer method",
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  677|  87.2k|			object_class->nickname);
  678|       |
  679|  72.5k|	return NULL;
  680|  87.2k|}
foreign.c:vips_foreign_save_class_init:
 1858|      1|{
 1859|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1860|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1861|      1|	VipsOperationClass *operation_class = (VipsOperationClass *) class;
 1862|       |
 1863|      1|	int i;
 1864|       |
 1865|      1|	gobject_class->dispose = vips_foreign_save_dispose;
 1866|      1|	gobject_class->set_property = vips_object_set_property;
 1867|      1|	gobject_class->get_property = vips_object_get_property;
 1868|       |
 1869|      1|	object_class->build = vips_foreign_save_build;
 1870|      1|	object_class->summary_class = vips_foreign_save_summary_class;
 1871|      1|	object_class->new_from_string = vips_foreign_save_new_from_string;
 1872|      1|	object_class->nickname = "save";
 1873|      1|	object_class->description = _("savers");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1874|       |
 1875|       |	/* All savers are sequential by definition. Things like tiled tiff
 1876|       |	 * write and interlaced png write, which are not, add extra caches
 1877|       |	 * on their input.
 1878|       |	 */
 1879|      1|	operation_class->flags |= VIPS_OPERATION_SEQUENTIAL;
 1880|       |
 1881|       |	/* Must not cache savers.
 1882|       |	 */
 1883|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
 1884|       |
 1885|       |	/* Default to no coding allowed.
 1886|       |	 */
 1887|      8|	for (i = 0; i < VIPS_CODING_LAST; i++)
  ------------------
  |  Branch (1887:14): [True: 7, False: 1]
  ------------------
 1888|      7|		class->coding[i] = FALSE;
  ------------------
  |  |  794|      7|#define	FALSE	(0)
  ------------------
 1889|      1|	class->coding[VIPS_CODING_NONE] = TRUE;
  ------------------
  |  |  798|      1|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      1|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1890|       |
 1891|       |	/* Default to no cast on save.
 1892|       |	 */
 1893|      1|	class->format_table = vips_foreign_save_format_table;
 1894|       |
 1895|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
 1896|      1|		_("Input"),
 1897|      1|		_("Image to save"),
 1898|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1899|      1|		G_STRUCT_OFFSET(VipsForeignSave, in));
 1900|       |
 1901|      1|	VIPS_ARG_FLAGS(class, "keep", 100,
  ------------------
  |  |  226|      1|	{ \
  |  |  227|      1|		GParamSpec *pspec; \
  |  |  228|      1|\
  |  |  229|      1|		pspec = g_param_spec_flags((NAME), (LONG), (DESC), \
  |  |  230|      1|			(TYPE), (VALUE), \
  |  |  231|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  232|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  233|      1|			vips_argument_get_id(), pspec); \
  |  |  234|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  235|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  236|      1|	}
  ------------------
 1902|      1|		_("Keep"),
 1903|      1|		_("Which metadata to retain"),
 1904|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1905|      1|		G_STRUCT_OFFSET(VipsForeignSave, keep),
 1906|      1|		VIPS_TYPE_FOREIGN_KEEP,
 1907|      1|		VIPS_FOREIGN_KEEP_ALL);
 1908|       |
 1909|      1|	VIPS_ARG_BOXED(class, "background", 101,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
 1910|      1|		_("Background"),
 1911|      1|		_("Background value"),
 1912|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1913|      1|		G_STRUCT_OFFSET(VipsForeignSave, background),
 1914|      1|		VIPS_TYPE_ARRAY_DOUBLE);
 1915|       |
 1916|      1|	VIPS_ARG_INT(class, "page_height", 102,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1917|      1|		_("Page height"),
 1918|      1|		_("Set page height for multipage save"),
 1919|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1920|      1|		G_STRUCT_OFFSET(VipsForeignSave, page_height),
 1921|      1|		0, VIPS_MAX_COORD, 0);
 1922|       |
 1923|      1|	VIPS_ARG_STRING(class, "profile", 103,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1924|      1|		_("Profile"),
 1925|      1|		_("Filename of ICC profile to embed"),
 1926|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1927|      1|		G_STRUCT_OFFSET(VipsForeignSave, profile),
 1928|      1|		NULL);
 1929|       |
 1930|      1|	VIPS_ARG_BOOL(class, "strip", 104,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1931|      1|		_("Strip"),
 1932|      1|		_("Strip all metadata from image"),
 1933|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
 1934|      1|		G_STRUCT_OFFSET(VipsForeignSave, strip),
 1935|      1|		FALSE);
 1936|      1|}
foreign.c:vips_foreign_save_dispose:
 1326|  10.9k|{
 1327|  10.9k|	VipsForeignSave *save = VIPS_FOREIGN_SAVE(gobject);
  ------------------
  |  |  299|  10.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  10.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  300|  10.9k|		VIPS_TYPE_FOREIGN_SAVE, VipsForeignSave))
  ------------------
 1328|       |
 1329|  10.9k|	VIPS_UNREF(save->ready);
  ------------------
  |  |   57|  10.9k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  10.9k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  10.9k|	{ \
  |  |  |  |   43|  10.9k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 10.9k, False: 2]
  |  |  |  |  ------------------
  |  |  |  |   44|  10.9k|			(void) F((S)); \
  |  |  |  |   45|  10.9k|			(S) = 0; \
  |  |  |  |   46|  10.9k|		} \
  |  |  |  |   47|  10.9k|	} \
  |  |  |  |   48|  10.9k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1330|       |
 1331|  10.9k|	G_OBJECT_CLASS(vips_foreign_save_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  10.9k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  10.9k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  10.9k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1332|  10.9k|}
foreign.c:vips_foreign_save_build:
 1785|  10.9k|{
 1786|  10.9k|	VipsForeignSave *save = VIPS_FOREIGN_SAVE(object);
  ------------------
  |  |  299|  10.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  10.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  300|  10.9k|		VIPS_TYPE_FOREIGN_SAVE, VipsForeignSave))
  ------------------
 1787|       |
 1788|       |	/* The deprecated "strip" field sets "keep" to none.
 1789|       |	 */
 1790|  10.9k|	if (vips_object_argument_isset(object, "strip") &&
  ------------------
  |  Branch (1790:6): [True: 0, False: 10.9k]
  ------------------
 1791|  10.9k|		!vips_object_argument_isset(object, "keep"))
  ------------------
  |  Branch (1791:3): [True: 0, False: 0]
  ------------------
 1792|      0|		save->keep = save->strip
  ------------------
  |  Branch (1792:16): [True: 0, False: 0]
  ------------------
 1793|      0|			? VIPS_FOREIGN_KEEP_NONE
 1794|      0|			: VIPS_FOREIGN_KEEP_ALL;
 1795|       |
 1796|       |	/* Keep ICC profile by default when a user profile has been set.
 1797|       |	 */
 1798|  10.9k|	if ((save->keep & VIPS_FOREIGN_KEEP_ICC) == 0 &&
  ------------------
  |  Branch (1798:6): [True: 0, False: 10.9k]
  ------------------
 1799|  10.9k|		vips_object_argument_isset(object, "profile"))
  ------------------
  |  Branch (1799:3): [True: 0, False: 0]
  ------------------
 1800|      0|		save->keep |= VIPS_FOREIGN_KEEP_ICC;
 1801|       |
 1802|  10.9k|	if (save->in) {
  ------------------
  |  Branch (1802:6): [True: 10.9k, False: 0]
  ------------------
 1803|  10.9k|		VipsForeignSaveClass *class = VIPS_FOREIGN_SAVE_GET_CLASS(save);
  ------------------
  |  |  309|  10.9k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  10.9k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  10.9k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  310|  10.9k|		VIPS_TYPE_FOREIGN_SAVE, VipsForeignSaveClass))
  ------------------
 1804|  10.9k|		VipsImage *ready;
 1805|  10.9k|		VipsImage *x;
 1806|       |
 1807|  10.9k|		if (vips__foreign_convert_saveable(save->in, &ready,
  ------------------
  |  Branch (1807:7): [True: 2, False: 10.9k]
  ------------------
 1808|  10.9k|				class->saveable, class->format_table, class->coding,
 1809|  10.9k|				save->background))
 1810|      2|			return -1;
 1811|       |
 1812|       |		/* Updating metadata, need to copy the image.
 1813|       |		 */
 1814|  10.9k|		if (vips_copy(ready, &x, NULL)) {
  ------------------
  |  Branch (1814:7): [True: 0, False: 10.9k]
  ------------------
 1815|      0|			VIPS_UNREF(ready);
  ------------------
  |  |   57|      0|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1816|      0|			return -1;
 1817|      0|		}
 1818|  10.9k|		VIPS_UNREF(ready);
  ------------------
  |  |   57|  10.9k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  10.9k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  10.9k|	{ \
  |  |  |  |   43|  10.9k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 10.9k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  10.9k|			(void) F((S)); \
  |  |  |  |   45|  10.9k|			(S) = 0; \
  |  |  |  |   46|  10.9k|		} \
  |  |  |  |   47|  10.9k|	} \
  |  |  |  |   48|  10.9k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1819|  10.9k|		ready = x;
 1820|       |
 1821|  10.9k|		if (vips__foreign_update_metadata(ready, save->keep)) {
  ------------------
  |  Branch (1821:7): [True: 0, False: 10.9k]
  ------------------
 1822|      0|			VIPS_UNREF(ready);
  ------------------
  |  |   57|      0|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1823|      0|			return -1;
 1824|      0|		}
 1825|       |
 1826|  10.9k|		if (save->page_height)
  ------------------
  |  Branch (1826:7): [True: 0, False: 10.9k]
  ------------------
 1827|      0|			vips_image_set_int(ready, VIPS_META_PAGE_HEIGHT,
  ------------------
  |  |  158|      0|#define VIPS_META_PAGE_HEIGHT "page-height"
  ------------------
 1828|      0|				save->page_height);
 1829|       |
 1830|  10.9k|		VIPS_UNREF(save->ready);
  ------------------
  |  |   57|  10.9k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  10.9k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  10.9k|	{ \
  |  |  |  |   43|  10.9k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 10.9k]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|  10.9k|	} \
  |  |  |  |   48|  10.9k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1831|  10.9k|		save->ready = ready;
 1832|  10.9k|	}
 1833|       |
 1834|  10.9k|	if (VIPS_OBJECT_CLASS(vips_foreign_save_parent_class)->build(object))
  ------------------
  |  |  435|  10.9k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  10.9k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  10.9k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1834:6): [True: 0, False: 10.9k]
  ------------------
 1835|      0|		return -1;
 1836|       |
 1837|  10.9k|	return 0;
 1838|  10.9k|}
foreign.c:vips_foreign_save_init:
 1940|  10.9k|{
 1941|  10.9k|	save->keep = VIPS_FOREIGN_KEEP_ALL;
 1942|  10.9k|	save->background = vips_array_double_newv(1, 0.0);
 1943|  10.9k|}
foreign.c:vips_foreign_find_save_target_sub:
 2115|   240k|{
 2116|   240k|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(save_class);
  ------------------
  |  |  435|   240k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   240k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   240k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2117|   240k|	VipsForeignClass *class = VIPS_FOREIGN_CLASS(save_class);
  ------------------
  |  |   49|   240k|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|   240k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   240k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|   240k|		VIPS_TYPE_FOREIGN, VipsForeignClass))
  ------------------
 2118|       |
 2119|       |	/* All concrete savers needs suffs, since we use the suff to pick the
 2120|       |	 * saver.
 2121|       |	 */
 2122|   240k|	if (!G_TYPE_IS_ABSTRACT(G_TYPE_FROM_CLASS(class)) &&
  ------------------
  |  |  343|   480k|#define G_TYPE_IS_ABSTRACT(type)                (g_type_test_flags ((type), G_TYPE_FLAG_ABSTRACT))
  ------------------
  |  Branch (2122:6): [True: 240k, False: 0]
  ------------------
 2123|   240k|		!class->suffs)
  ------------------
  |  Branch (2123:3): [True: 0, False: 240k]
  ------------------
 2124|      0|		g_warning("no suffix defined for %s", object_class->nickname);
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 2125|       |
 2126|   240k|	if (!G_TYPE_IS_ABSTRACT(G_TYPE_FROM_CLASS(class)) &&
  ------------------
  |  |  343|   480k|#define G_TYPE_IS_ABSTRACT(type)                (g_type_test_flags ((type), G_TYPE_FLAG_ABSTRACT))
  ------------------
  |  Branch (2126:6): [True: 240k, False: 0]
  ------------------
 2127|   240k|		class->suffs &&
  ------------------
  |  Branch (2127:3): [True: 240k, False: 0]
  ------------------
 2128|   240k|		g_str_has_suffix(object_class->nickname, "_target") &&
  ------------------
  |  Branch (2128:3): [True: 120k, False: 120k]
  ------------------
 2129|   240k|		vips_filename_suffix_match(suffix, class->suffs))
  ------------------
  |  Branch (2129:3): [True: 10.9k, False: 109k]
  ------------------
 2130|  10.9k|		return save_class;
 2131|       |
 2132|   229k|	return NULL;
 2133|   240k|}

vips__heif_init:
  232|      2|{
  233|      2|#ifdef HAVE_HEIF_INIT
  234|      2|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|      2|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
  235|       |
  236|      2|	VIPS_ONCE(&once, vips__heif_init_once, NULL);
  ------------------
  |  |   93|      2|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      2|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|      2|	{ \
  |  |   95|      2|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|      2|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|      2| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|      2|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|      2|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 1]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|      2|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|      2|   else                                         \
  |  |  |  |  |  |  931|      2|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|      2|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|      2|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 1]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|      2|			(void) g_once(ONCE, FUNC, CLIENT); \
  |  |  ------------------
  |  |  |  |  241|      1|  (((once)->status == G_ONCE_STATUS_READY) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (241:4): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  |  |  242|      1|   (once)->retval : \
  |  |  |  |  243|      1|   g_once_impl ((once), (func), (arg)))
  |  |  ------------------
  |  |   97|      2|	} \
  |  |   98|      2|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      2|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  237|      2|#endif /*HAVE_HEIF_INIT*/
  238|      2|}
vips__heif_error:
  242|  4.11k|{
  243|  4.11k|	if (error->code)
  ------------------
  |  Branch (243:6): [True: 4.11k, False: 0]
  ------------------
  244|  4.11k|		vips_error("heif", "%s (%d.%d)",
  245|  4.11k|			error->message ? error->message : "(null)",
  ------------------
  |  Branch (245:4): [True: 4.11k, False: 0]
  ------------------
  246|  4.11k|			error->code, error->subcode);
  247|  4.11k|}
vips__heif_chroma:
  297|  3.52k|{
  298|  3.52k|	if (bits_per_pixel == 8) {
  ------------------
  |  Branch (298:6): [True: 3.20k, False: 320]
  ------------------
  299|  3.20k|		if (has_alpha)
  ------------------
  |  Branch (299:7): [True: 0, False: 3.20k]
  ------------------
  300|      0|			return heif_chroma_interleaved_RGBA;
  301|  3.20k|		else
  302|  3.20k|			return heif_chroma_interleaved_RGB;
  303|  3.20k|	}
  304|    320|	else {
  305|    320|		if (has_alpha)
  ------------------
  |  Branch (305:7): [True: 0, False: 320]
  ------------------
  306|      0|			return heif_chroma_interleaved_RRGGBBAA_BE;
  307|    320|		else
  308|    320|			return heif_chroma_interleaved_RRGGBB_BE;
  309|    320|	}
  310|  3.52k|}
heifload.c:vips__heif_init_once:
  217|      1|{
  218|      1|	struct heif_error error;
  219|       |
  220|      1|	error = heif_init(NULL);
  221|      1|	if (error.code)
  ------------------
  |  Branch (221:6): [True: 0, False: 1]
  ------------------
  222|      0|		g_warning("heif_init: %s (%d.%d)\n",
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (340:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  223|      1|			error.message ? error.message : "(null)",
  224|      1|			error.code, error.subcode);
  225|       |
  226|      1|	return NULL;
  227|      1|}
heifload.c:vips_foreign_load_heif_class_init:
 1063|      1|{
 1064|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1065|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1066|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
 1067|       |
 1068|      1|	vips__heif_init();
 1069|       |
 1070|      1|	gobject_class->dispose = vips_foreign_load_heif_dispose;
 1071|      1|	gobject_class->set_property = vips_object_set_property;
 1072|      1|	gobject_class->get_property = vips_object_get_property;
 1073|       |
 1074|      1|	object_class->nickname = "heifload_base";
 1075|      1|	object_class->description = _("load a HEIF image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1076|      1|	object_class->build = vips_foreign_load_heif_build;
 1077|       |
 1078|      1|	load_class->get_flags = vips_foreign_load_heif_get_flags;
 1079|      1|	load_class->header = vips_foreign_load_heif_header;
 1080|      1|	load_class->load = vips_foreign_load_heif_load;
 1081|       |
 1082|      1|	VIPS_ARG_INT(class, "page", 2,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1083|      1|		_("Page"),
 1084|      1|		_("First page to load"),
 1085|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1086|      1|		G_STRUCT_OFFSET(VipsForeignLoadHeif, page),
 1087|      1|		0, 100000, 0);
 1088|       |
 1089|      1|	VIPS_ARG_INT(class, "n", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1090|      1|		_("n"),
 1091|      1|		_("Number of pages to load, -1 for all"),
 1092|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1093|      1|		G_STRUCT_OFFSET(VipsForeignLoadHeif, n),
 1094|      1|		-1, 100000, 1);
 1095|       |
 1096|      1|	VIPS_ARG_BOOL(class, "thumbnail", 4,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1097|      1|		_("Thumbnail"),
 1098|      1|		_("Fetch thumbnail image"),
 1099|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1100|      1|		G_STRUCT_OFFSET(VipsForeignLoadHeif, thumbnail),
 1101|      1|		FALSE);
 1102|       |
 1103|      1|	VIPS_ARG_BOOL(class, "autorotate", 21,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1104|      1|		_("Autorotate"),
 1105|      1|		_("Rotate image using exif orientation"),
 1106|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
 1107|      1|		G_STRUCT_OFFSET(VipsForeignLoadHeif, autorotate),
 1108|      1|		FALSE);
 1109|       |
 1110|       |#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
 1111|       |	VIPS_ARG_BOOL(class, "unlimited", 22,
 1112|       |		_("Unlimited"),
 1113|       |		_("Remove all denial of service limits"),
 1114|       |		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1115|       |		G_STRUCT_OFFSET(VipsForeignLoadHeif, unlimited),
 1116|       |		FALSE);
 1117|       |#endif
 1118|      1|}
heifload.c:vips_foreign_load_heif_dispose:
  322|  4.14k|{
  323|  4.14k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) gobject;
  324|       |
  325|  4.14k|	heif->data = NULL;
  326|  4.14k|	VIPS_FREEF(heif_image_release, heif->img);
  ------------------
  |  |   41|  4.14k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.14k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  4.14k|	{ \
  |  |   43|  4.14k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 2, False: 4.13k]
  |  |  ------------------
  |  |   44|      2|			(void) F((S)); \
  |  |   45|      2|			(S) = 0; \
  |  |   46|      2|		} \
  |  |   47|  4.14k|	} \
  |  |   48|  4.14k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.14k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  327|  4.14k|	VIPS_FREEF(heif_image_handle_release, heif->handle);
  ------------------
  |  |   41|  4.14k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.14k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  4.14k|	{ \
  |  |   43|  4.14k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 3.55k, False: 589]
  |  |  ------------------
  |  |   44|  3.55k|			(void) F((S)); \
  |  |   45|  3.55k|			(S) = 0; \
  |  |   46|  3.55k|		} \
  |  |   47|  4.14k|	} \
  |  |   48|  4.14k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.14k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  328|  4.14k|	VIPS_FREEF(heif_context_free, heif->ctx);
  ------------------
  |  |   41|  4.14k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.14k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  4.14k|	{ \
  |  |   43|  4.14k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 4.14k, False: 0]
  |  |  ------------------
  |  |   44|  4.14k|			(void) F((S)); \
  |  |   45|  4.14k|			(S) = 0; \
  |  |   46|  4.14k|		} \
  |  |   47|  4.14k|	} \
  |  |   48|  4.14k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.14k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  329|  4.14k|	VIPS_FREE(heif->id);
  ------------------
  |  |   50|  4.14k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  4.14k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  4.14k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  4.14k|	{ \
  |  |  |  |   43|  4.14k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 3.55k, False: 589]
  |  |  |  |  ------------------
  |  |  |  |   44|  3.55k|			(void) F((S)); \
  |  |  |  |   45|  3.55k|			(S) = 0; \
  |  |  |  |   46|  3.55k|		} \
  |  |  |  |   47|  4.14k|	} \
  |  |  |  |   48|  4.14k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  4.14k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|  4.14k|	VIPS_FREE(heif->reader);
  ------------------
  |  |   50|  4.14k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  4.14k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  4.14k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  4.14k|	{ \
  |  |  |  |   43|  4.14k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 4.14k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  4.14k|			(void) F((S)); \
  |  |  |  |   45|  4.14k|			(S) = 0; \
  |  |  |  |   46|  4.14k|		} \
  |  |  |  |   47|  4.14k|	} \
  |  |  |  |   48|  4.14k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  4.14k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  331|  4.14k|	VIPS_UNREF(heif->source);
  ------------------
  |  |   57|  4.14k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  4.14k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  4.14k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  4.14k|	{ \
  |  |  |  |   43|  4.14k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 4.14k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  4.14k|			(void) F((S)); \
  |  |  |  |   45|  4.14k|			(S) = 0; \
  |  |  |  |   46|  4.14k|		} \
  |  |  |  |   47|  4.14k|	} \
  |  |  |  |   48|  4.14k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  4.14k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|       |
  333|  4.14k|	G_OBJECT_CLASS(vips_foreign_load_heif_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  4.14k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  4.14k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  4.14k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  334|  4.14k|}
heifload.c:vips_foreign_load_heif_build:
  338|  4.14k|{
  339|  4.14k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) object;
  340|       |
  341|       |#ifdef DEBUG
  342|       |	printf("vips_foreign_load_heif_build:\n");
  343|       |#endif /*DEBUG*/
  344|       |
  345|  4.14k|	if (heif->source &&
  ------------------
  |  Branch (345:6): [True: 4.14k, False: 0]
  ------------------
  346|  4.14k|		vips_source_rewind(heif->source))
  ------------------
  |  Branch (346:3): [True: 0, False: 4.14k]
  ------------------
  347|      0|		return -1;
  348|       |
  349|  4.14k|	if (!heif->ctx) {
  ------------------
  |  Branch (349:6): [True: 4.14k, False: 0]
  ------------------
  350|  4.14k|		struct heif_error error;
  351|       |
  352|  4.14k|		heif->ctx = heif_context_alloc();
  353|  4.14k|#ifdef HAVE_HEIF_SET_MAX_IMAGE_SIZE_LIMIT
  354|  4.14k|		heif_context_set_maximum_image_size_limit(heif->ctx,
  355|  4.14k|			heif->unlimited ? USHRT_MAX : 0x4000);
  ------------------
  |  Branch (355:4): [True: 0, False: 4.14k]
  ------------------
  356|  4.14k|#endif /* HAVE_HEIF_SET_MAX_IMAGE_SIZE_LIMIT */
  357|  4.14k|		error = heif_context_read_from_reader(heif->ctx,
  358|  4.14k|			heif->reader, heif, NULL);
  359|  4.14k|		if (error.code) {
  ------------------
  |  Branch (359:7): [True: 589, False: 3.55k]
  ------------------
  360|    589|			vips__heif_error(&error);
  361|    589|			return -1;
  362|    589|		}
  363|  4.14k|	}
  364|       |
  365|  3.55k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_heif_parent_class)->build(object))
  ------------------
  |  |  435|  3.55k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  3.55k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  3.55k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (365:6): [True: 15, False: 3.53k]
  ------------------
  366|     15|		return -1;
  367|       |
  368|  3.53k|	return 0;
  369|  3.55k|}
heifload.c:vips_foreign_load_heif_get_flags:
  420|  3.55k|{
  421|       |	/* FIXME .. could support random access for grid images.
  422|       |	 */
  423|  3.55k|	return VIPS_FOREIGN_SEQUENTIAL;
  424|  3.55k|}
heifload.c:vips_foreign_load_heif_header:
  780|  3.55k|{
  781|  3.55k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(load);
  ------------------
  |  |  441|  3.55k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  3.55k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  3.55k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  782|  3.55k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) load;
  783|       |
  784|  3.55k|	struct heif_error error;
  785|  3.55k|	heif_item_id primary_id;
  786|  3.55k|	int i;
  787|       |
  788|       |#ifdef DEBUG
  789|       |	printf("vips_foreign_load_heif_header:\n");
  790|       |#endif /*DEBUG*/
  791|       |
  792|  3.55k|	heif->n_top = heif_context_get_number_of_top_level_images(heif->ctx);
  793|  3.55k|	heif->id = VIPS_ARRAY(NULL, heif->n_top, heif_item_id);
  ------------------
  |  |   72|  3.55k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  3.55k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  3.55k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  3.55k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  3.55k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  794|  3.55k|	heif_context_get_list_of_top_level_image_IDs(heif->ctx,
  795|  3.55k|		heif->id, heif->n_top);
  796|       |
  797|       |	/* Note page number of primary image.
  798|       |	 */
  799|  3.55k|	error = heif_context_get_primary_image_ID(heif->ctx, &primary_id);
  800|  3.55k|	if (error.code) {
  ------------------
  |  Branch (800:6): [True: 0, False: 3.55k]
  ------------------
  801|      0|		vips__heif_error(&error);
  802|      0|		return -1;
  803|      0|	}
  804|  7.10k|	for (i = 0; i < heif->n_top; i++)
  ------------------
  |  Branch (804:14): [True: 3.55k, False: 3.55k]
  ------------------
  805|  3.55k|		if (heif->id[i] == primary_id)
  ------------------
  |  Branch (805:7): [True: 3.55k, False: 1]
  ------------------
  806|  3.55k|			heif->primary_page = i;
  807|       |
  808|       |	/* If @n and @page have not been set, @page defaults to the primary
  809|       |	 * page.
  810|       |	 */
  811|  3.55k|	if (!vips_object_argument_isset(VIPS_OBJECT(load), "page") &&
  ------------------
  |  |  433|  3.55k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  3.55k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  3.55k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (811:6): [True: 3.55k, False: 0]
  ------------------
  812|  3.55k|		!vips_object_argument_isset(VIPS_OBJECT(load), "n"))
  ------------------
  |  |  433|  3.55k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  3.55k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  3.55k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (812:3): [True: 3.55k, False: 0]
  ------------------
  813|  3.55k|		heif->page = heif->primary_page; // FIXME: Invalidates operation cache
  814|       |
  815|  3.55k|	if (heif->n == -1)
  ------------------
  |  Branch (815:6): [True: 0, False: 3.55k]
  ------------------
  816|      0|		heif->n = heif->n_top - heif->page; // FIXME: Invalidates operation cache
  817|  3.55k|	if (heif->page < 0 ||
  ------------------
  |  Branch (817:6): [True: 0, False: 3.55k]
  ------------------
  818|  3.55k|		heif->n <= 0 ||
  ------------------
  |  Branch (818:3): [True: 0, False: 3.55k]
  ------------------
  819|  3.55k|		heif->page + heif->n > heif->n_top) {
  ------------------
  |  Branch (819:3): [True: 0, False: 3.55k]
  ------------------
  820|      0|		vips_error(class->nickname, "%s", _("bad page number"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  821|      0|		return -1;
  822|      0|	}
  823|       |
  824|       |#ifdef DEBUG
  825|       |	for (i = heif->page; i < heif->page + heif->n; i++) {
  826|       |		heif_item_id thumb_ids[1];
  827|       |		int n_items;
  828|       |		int n_thumbs;
  829|       |		int j;
  830|       |
  831|       |		if (vips_foreign_load_heif_set_page(heif, i, FALSE))
  832|       |			return -1;
  833|       |
  834|       |		n_thumbs = heif_image_handle_get_number_of_thumbnails(heif->handle);
  835|       |		n_items = heif_image_handle_get_list_of_thumbnail_IDs(heif->handle,
  836|       |			thumb_ids, 1);
  837|       |
  838|       |		printf("page = %d\n", i);
  839|       |		printf("n_thumbs = %d\n", n_thumbs);
  840|       |		printf("n_items = %d\n", n_items);
  841|       |
  842|       |		for (j = 0; j < n_items; j++) {
  843|       |			struct heif_image_handle *thumb_handle;
  844|       |
  845|       |			error = heif_image_handle_get_thumbnail(heif->handle,
  846|       |				thumb_ids[j], &thumb_handle);
  847|       |			if (error.code) {
  848|       |				vips__heif_error(&error);
  849|       |				return -1;
  850|       |			}
  851|       |
  852|       |			printf("  thumb %d\n", j);
  853|       |			printf("    width = %d\n",
  854|       |				heif_image_handle_get_width(thumb_handle));
  855|       |			printf("    height = %d\n",
  856|       |				heif_image_handle_get_height(thumb_handle));
  857|       |			printf("    bits_per_pixel = %d\n",
  858|       |				heif_image_handle_get_luma_bits_per_pixel(thumb_handle));
  859|       |		}
  860|       |	}
  861|       |#endif /*DEBUG*/
  862|       |
  863|       |	/* All pages must be the same size for libvips toilet roll images.
  864|       |	 */
  865|  3.55k|	if (vips_foreign_load_heif_set_page(heif, heif->page, heif->thumbnail))
  ------------------
  |  Branch (865:6): [True: 0, False: 3.55k]
  ------------------
  866|      0|		return -1;
  867|  3.55k|	heif->page_width = heif_image_handle_get_width(heif->handle);
  868|  3.55k|	heif->page_height = heif_image_handle_get_height(heif->handle);
  869|  3.55k|	heif->bits_per_pixel =
  870|  3.55k|		heif_image_handle_get_luma_bits_per_pixel(heif->handle);
  871|  3.55k|	if (heif->bits_per_pixel < 0) {
  ------------------
  |  Branch (871:6): [True: 11, False: 3.54k]
  ------------------
  872|     11|		vips_error(class->nickname, "%s", _("undefined bits per pixel"));
  ------------------
  |  |   30|     11|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     11|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  873|     11|		return -1;
  874|     11|	}
  875|       |
  876|  3.54k|	for (i = heif->page + 1; i < heif->page + heif->n; i++) {
  ------------------
  |  Branch (876:27): [True: 0, False: 3.54k]
  ------------------
  877|      0|		if (vips_foreign_load_heif_set_page(heif, i, heif->thumbnail))
  ------------------
  |  Branch (877:7): [True: 0, False: 0]
  ------------------
  878|      0|			return -1;
  879|      0|		if (heif_image_handle_get_width(heif->handle) != heif->page_width ||
  ------------------
  |  Branch (879:7): [True: 0, False: 0]
  ------------------
  880|      0|			heif_image_handle_get_height(heif->handle) != heif->page_height ||
  ------------------
  |  Branch (880:4): [True: 0, False: 0]
  ------------------
  881|      0|			heif_image_handle_get_luma_bits_per_pixel(heif->handle) !=
  ------------------
  |  Branch (881:4): [True: 0, False: 0]
  ------------------
  882|      0|				heif->bits_per_pixel) {
  883|      0|			vips_error(class->nickname, "%s",
  884|      0|				_("not all pages are the same size"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  885|      0|			return -1;
  886|      0|		}
  887|      0|	}
  888|       |
  889|       |#ifdef DEBUG
  890|       |	printf("page_width = %d\n", heif->page_width);
  891|       |	printf("page_height = %d\n", heif->page_height);
  892|       |	printf("bits_per_pixel = %d\n", heif->bits_per_pixel);
  893|       |
  894|       |	printf("n_top = %d\n", heif->n_top);
  895|       |	for (i = 0; i < heif->n_top; i++) {
  896|       |		printf("  id[%d] = %d\n", i, heif->id[i]);
  897|       |		if (vips_foreign_load_heif_set_page(heif, i, FALSE))
  898|       |			return -1;
  899|       |		printf("    width = %d\n",
  900|       |			heif_image_handle_get_width(heif->handle));
  901|       |		printf("    height = %d\n",
  902|       |			heif_image_handle_get_height(heif->handle));
  903|       |		printf("    bits_per_pixel = %d\n",
  904|       |			heif_image_handle_get_luma_bits_per_pixel(heif->handle));
  905|       |		printf("    has_depth = %d\n",
  906|       |			heif_image_handle_has_depth_image(heif->handle));
  907|       |		printf("    has_alpha = %d\n",
  908|       |			heif_image_handle_has_alpha_channel(heif->handle));
  909|       |		printf("    n_metadata = %d\n",
  910|       |			heif_image_handle_get_number_of_metadata_blocks(
  911|       |				heif->handle, NULL));
  912|       |#ifdef HAVE_HEIF_COLOR_PROFILE
  913|       |		printf("    colour profile type = 0x%xd\n",
  914|       |			heif_image_handle_get_color_profile_type(heif->handle));
  915|       |#endif /*HAVE_HEIF_COLOR_PROFILE*/
  916|       |	}
  917|       |#endif /*DEBUG*/
  918|       |
  919|  3.54k|	if (vips_foreign_load_heif_set_header(heif, load->out))
  ------------------
  |  Branch (919:6): [True: 4, False: 3.53k]
  ------------------
  920|      4|		return -1;
  921|       |
  922|  3.53k|	vips_source_minimise(heif->source);
  923|       |
  924|  3.53k|	return 0;
  925|  3.54k|}
heifload.c:vips_foreign_load_heif_set_page:
  501|  14.1k|{
  502|  14.1k|	if (!heif->handle ||
  ------------------
  |  Branch (502:6): [True: 3.55k, False: 10.5k]
  ------------------
  503|  14.1k|		page_no != heif->page_no ||
  ------------------
  |  Branch (503:3): [True: 0, False: 10.5k]
  ------------------
  504|  14.1k|		thumbnail != heif->thumbnail_set) {
  ------------------
  |  Branch (504:3): [True: 0, False: 10.5k]
  ------------------
  505|  3.55k|		struct heif_error error;
  506|       |
  507|       |#ifdef DEBUG
  508|       |		printf("vips_foreign_load_heif_set_page: %d, thumbnail = %d\n",
  509|       |			page_no, thumbnail);
  510|       |#endif /*DEBUG*/
  511|       |
  512|  3.55k|		VIPS_FREEF(heif_image_handle_release, heif->handle);
  ------------------
  |  |   41|  3.55k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  3.55k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  3.55k|	{ \
  |  |   43|  3.55k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 3.55k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  3.55k|	} \
  |  |   48|  3.55k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.55k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  513|  3.55k|		VIPS_FREEF(heif_image_release, heif->img);
  ------------------
  |  |   41|  3.55k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  3.55k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  3.55k|	{ \
  |  |   43|  3.55k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 3.55k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  3.55k|	} \
  |  |   48|  3.55k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.55k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  514|  3.55k|		heif->data = NULL;
  515|  3.55k|		heif->thumbnail_set = FALSE;
  ------------------
  |  |  794|  3.55k|#define	FALSE	(0)
  ------------------
  516|       |
  517|  3.55k|		error = heif_context_get_image_handle(heif->ctx,
  518|  3.55k|			heif->id[page_no], &heif->handle);
  519|  3.55k|		if (error.code) {
  ------------------
  |  Branch (519:7): [True: 0, False: 3.55k]
  ------------------
  520|      0|			vips__heif_error(&error);
  521|      0|			return -1;
  522|      0|		}
  523|       |
  524|  3.55k|		if (thumbnail) {
  ------------------
  |  Branch (524:7): [True: 0, False: 3.55k]
  ------------------
  525|      0|			if (vips_foreign_load_heif_set_thumbnail(heif))
  ------------------
  |  Branch (525:8): [True: 0, False: 0]
  ------------------
  526|      0|				return -1;
  527|       |
  528|       |			/* If we were asked to select the thumbnail, say we
  529|       |			 * did, even if there are no thumbnails and we just
  530|       |			 * selected the main image.
  531|       |			 *
  532|       |			 * If we don't do this, next time around in _generate
  533|       |			 * we'll try to select the thumbnail again, which will
  534|       |			 * be horribly slow.
  535|       |			 */
  536|      0|			heif->thumbnail_set = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  537|      0|		}
  538|       |
  539|  3.55k|		heif->page_no = page_no;
  540|  3.55k|	}
  541|       |
  542|  14.1k|	return 0;
  543|  14.1k|}
heifload.c:vips_foreign_load_heif_set_header:
  547|  7.07k|{
  548|  7.07k|	VipsForeignLoad *load = (VipsForeignLoad *) heif;
  549|       |
  550|  7.07k|	int bands;
  551|  7.07k|	int i;
  552|       |	/* Surely, 16 metadata items will be enough for anyone.
  553|       |	 */
  554|  7.07k|	heif_item_id id[16];
  555|  7.07k|	int n_metadata;
  556|  7.07k|	struct heif_error error;
  557|  7.07k|	VipsForeignHeifCompression compression;
  558|  7.07k|	VipsInterpretation interpretation;
  559|  7.07k|	VipsBandFormat format;
  560|       |
  561|       |	/* We take the metadata from the non-thumbnail first page. HEIC
  562|       |	 * thumbnails don't have metadata.
  563|       |	 */
  564|  7.07k|	if (vips_foreign_load_heif_set_page(heif, heif->page, FALSE))
  ------------------
  |  |  794|  7.07k|#define	FALSE	(0)
  ------------------
  |  Branch (564:6): [True: 0, False: 7.07k]
  ------------------
  565|      0|		return -1;
  566|       |
  567|       |	/* Verify dimensions
  568|       |	 */
  569|  7.07k|	if (heif->page_width < 1 ||
  ------------------
  |  Branch (569:6): [True: 4, False: 7.06k]
  ------------------
  570|  7.07k|		heif->page_height < 1) {
  ------------------
  |  Branch (570:3): [True: 0, False: 7.06k]
  ------------------
  571|      4|		vips_error("heifload", "%s", _("bad dimensions"));
  ------------------
  |  |   30|      4|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      4|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  572|      4|		return -1;
  573|      4|	}
  574|       |
  575|  7.06k|	heif->has_alpha = heif_image_handle_has_alpha_channel(heif->handle);
  576|       |#ifdef DEBUG
  577|       |	printf("heif_image_handle_has_alpha_channel() = %d\n", heif->has_alpha);
  578|       |#endif /*DEBUG*/
  579|  7.06k|	bands = heif->has_alpha ? 4 : 3;
  ------------------
  |  Branch (579:10): [True: 0, False: 7.06k]
  ------------------
  580|       |
  581|       |#ifdef DEBUG
  582|       |	printf("heif_image_handle_get_luma_bits_per_pixel() = %d\n",
  583|       |		heif_image_handle_get_luma_bits_per_pixel(heif->handle));
  584|       |#endif /*DEBUG*/
  585|       |
  586|       |	/* FIXME .. IPTC as well?
  587|       |	 */
  588|  7.06k|	n_metadata = heif_image_handle_get_list_of_metadata_block_IDs(
  589|  7.06k|		heif->handle, NULL, id, VIPS_NUMBER(id));
  ------------------
  |  |   60|  7.06k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  590|  7.06k|	for (i = 0; i < n_metadata; i++) {
  ------------------
  |  Branch (590:14): [True: 0, False: 7.06k]
  ------------------
  591|      0|		size_t length =
  592|      0|			heif_image_handle_get_metadata_size(heif->handle, id[i]);
  593|      0|		const char *type =
  594|      0|			heif_image_handle_get_metadata_type(heif->handle, id[i]);
  595|      0|		const char *content_type =
  596|      0|			heif_image_handle_get_metadata_content_type(heif->handle, id[i]);
  597|       |
  598|      0|		unsigned char *data;
  599|      0|		char name[256];
  600|       |
  601|       |#ifdef DEBUG
  602|       |		printf("metadata type = %s, length = %zu\n", type, length);
  603|       |#endif /*DEBUG*/
  604|       |
  605|      0|		if (!length)
  ------------------
  |  Branch (605:7): [True: 0, False: 0]
  ------------------
  606|      0|			continue;
  607|      0|		if (!(data = VIPS_ARRAY(NULL, length, unsigned char)))
  ------------------
  |  |   72|      0|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|      0|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (607:7): [True: 0, False: 0]
  ------------------
  608|      0|			return -1;
  609|      0|		error = heif_image_handle_get_metadata(heif->handle, id[i], data);
  610|      0|		if (error.code) {
  ------------------
  |  Branch (610:7): [True: 0, False: 0]
  ------------------
  611|      0|			VIPS_FREE(data);
  ------------------
  |  |   50|      0|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  612|      0|			vips__heif_error(&error);
  613|      0|			return -1;
  614|      0|		}
  615|       |
  616|       |		/* We need to skip the first four bytes of EXIF, they just
  617|       |		 * contain the offset.
  618|       |		 */
  619|      0|		if (length > 4 &&
  ------------------
  |  Branch (619:7): [True: 0, False: 0]
  ------------------
  620|      0|			g_ascii_strcasecmp(type, "exif") == 0) {
  ------------------
  |  Branch (620:4): [True: 0, False: 0]
  ------------------
  621|      0|			length -= 4;
  622|      0|			memmove(data, data + 4, length);
  623|      0|		}
  624|       |
  625|       |		/* Exif data will have the type string "exif".
  626|       |		 *
  627|       |		 * For XMP, the content type is "application/rdf+xml".
  628|       |		 */
  629|      0|		if (g_ascii_strcasecmp(type, "exif") == 0)
  ------------------
  |  Branch (629:7): [True: 0, False: 0]
  ------------------
  630|      0|			g_snprintf(name, 256, VIPS_META_EXIF_NAME);
  ------------------
  |  |   46|      0|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  631|      0|		else if (g_ascii_strcasecmp(content_type, "application/rdf+xml") == 0)
  ------------------
  |  Branch (631:12): [True: 0, False: 0]
  ------------------
  632|      0|			g_snprintf(name, 256, VIPS_META_XMP_NAME);
  ------------------
  |  |   53|      0|#define VIPS_META_XMP_NAME "xmp-data"
  ------------------
  633|      0|		else
  634|      0|			g_snprintf(name, 256, "heif-%s-%d", type, i);
  635|       |
  636|      0|		vips_image_set_blob(out, name,
  637|      0|			(VipsCallbackFn) vips_area_free_cb, data, length);
  638|       |
  639|       |		/* image_set will automatically parse EXIF, if necessary.
  640|       |		 */
  641|      0|	}
  642|       |
  643|       |	/* We use libheif's autorotate, so we need to remove any EXIF
  644|       |	 * orientation tags.
  645|       |	 *
  646|       |	 * According to the HEIF standard, EXIF orientation tags are only
  647|       |	 * informational and images should not be rotated because of them.
  648|       |	 * Unless we strip these tags, there's a danger downstream processing
  649|       |	 * could double-rotate.
  650|       |	 */
  651|  7.06k|	vips_autorot_remove_angle(out);
  652|       |
  653|  7.06k|#ifdef HAVE_HEIF_COLOR_PROFILE
  654|  7.06k|	enum heif_color_profile_type profile_type =
  655|  7.06k|		heif_image_handle_get_color_profile_type(heif->handle);
  656|       |
  657|       |#ifdef DEBUG
  658|       |	{
  659|       |		printf("profile type = ");
  660|       |		switch (profile_type) {
  661|       |		case heif_color_profile_type_not_present:
  662|       |			printf("none");
  663|       |			break;
  664|       |
  665|       |		case heif_color_profile_type_nclx:
  666|       |			printf("nclx");
  667|       |			break;
  668|       |
  669|       |		case heif_color_profile_type_rICC:
  670|       |			printf("rICC");
  671|       |			break;
  672|       |
  673|       |		case heif_color_profile_type_prof:
  674|       |			printf("prof");
  675|       |			break;
  676|       |
  677|       |		default:
  678|       |			printf("unknown");
  679|       |			break;
  680|       |		}
  681|       |		printf("\n");
  682|       |	}
  683|       |#endif /*DEBUG*/
  684|       |
  685|       |	/* lcms can load standard (prof) and reduced (rICC) profiles
  686|       |	 */
  687|  7.06k|	if (profile_type == heif_color_profile_type_prof ||
  ------------------
  |  Branch (687:6): [True: 0, False: 7.06k]
  ------------------
  688|  7.06k|		profile_type == heif_color_profile_type_rICC) {
  ------------------
  |  Branch (688:3): [True: 0, False: 7.06k]
  ------------------
  689|      0|		size_t length = heif_image_handle_get_raw_color_profile_size(
  690|      0|			heif->handle);
  691|       |
  692|      0|		unsigned char *data;
  693|       |
  694|      0|		if (!(data = VIPS_ARRAY(NULL, length, unsigned char)))
  ------------------
  |  |   72|      0|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|      0|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (694:7): [True: 0, False: 0]
  ------------------
  695|      0|			return -1;
  696|      0|		error = heif_image_handle_get_raw_color_profile(heif->handle, data);
  697|      0|		if (error.code) {
  ------------------
  |  Branch (697:7): [True: 0, False: 0]
  ------------------
  698|      0|			VIPS_FREE(data);
  ------------------
  |  |   50|      0|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  699|      0|			vips__heif_error(&error);
  700|      0|			return -1;
  701|      0|		}
  702|       |
  703|       |#ifdef DEBUG
  704|       |		printf("profile data, length = %zd\n", length);
  705|       |#endif /*DEBUG*/
  706|       |
  707|      0|		vips_image_set_blob(out, VIPS_META_ICC_NAME,
  ------------------
  |  |   78|      0|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  708|      0|			(VipsCallbackFn) vips_area_free_cb, data, length);
  709|      0|	}
  710|  7.06k|	else if (profile_type == heif_color_profile_type_nclx) {
  ------------------
  |  Branch (710:11): [True: 0, False: 7.06k]
  ------------------
  711|      0|		g_info("heifload: ignoring nclx profile");
  ------------------
  |  |  341|      0|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      0|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      0|                               __VA_ARGS__)
  ------------------
  712|      0|	}
  713|  7.06k|#endif /*HAVE_HEIF_COLOR_PROFILE*/
  714|       |
  715|  7.06k|	vips_image_set_int(out, "heif-primary", heif->primary_page);
  716|  7.06k|	vips_image_set_int(out, VIPS_META_N_PAGES, heif->n_top);
  ------------------
  |  |  165|  7.06k|#define VIPS_META_N_PAGES "n-pages"
  ------------------
  717|       |
  718|       |	/* Only set page-height if we have more than one page, or this could
  719|       |	 * accidentally turn into an animated image later.
  720|       |	 */
  721|  7.06k|	if (heif->n > 1)
  ------------------
  |  Branch (721:6): [True: 0, False: 7.06k]
  ------------------
  722|      0|		vips_image_set_int(out, VIPS_META_PAGE_HEIGHT, heif->page_height);
  ------------------
  |  |  158|      0|#define VIPS_META_PAGE_HEIGHT "page-height"
  ------------------
  723|       |
  724|       |	/* Determine compression from HEIF "brand". heif_avif and heif_avis
  725|       |	 * were added in v1.7.
  726|       |	 */
  727|  7.06k|	compression = VIPS_FOREIGN_HEIF_COMPRESSION_HEVC;
  728|       |
  729|  7.06k|#ifdef HAVE_HEIF_AVIF
  730|  7.06k|	{
  731|  7.06k|		const unsigned char *brand_data;
  732|       |
  733|  7.06k|		if ((brand_data = vips_source_sniff(heif->source, 12))) {
  ------------------
  |  Branch (733:7): [True: 7.06k, False: 0]
  ------------------
  734|  7.06k|			enum heif_brand brand;
  735|  7.06k|			brand = heif_main_brand(brand_data, 12);
  736|  7.06k|			if (brand == heif_avif ||
  ------------------
  |  Branch (736:8): [True: 4.61k, False: 2.45k]
  ------------------
  737|  7.06k|				brand == heif_avis)
  ------------------
  |  Branch (737:5): [True: 0, False: 2.45k]
  ------------------
  738|  4.61k|				compression = VIPS_FOREIGN_HEIF_COMPRESSION_AV1;
  739|  7.06k|		}
  740|  7.06k|	}
  741|  7.06k|#endif /*HAVE_HEIF_AVIF*/
  742|       |
  743|  7.06k|	vips_image_set_string(out, "heif-compression",
  744|  7.06k|		vips_enum_nick(VIPS_TYPE_FOREIGN_HEIF_COMPRESSION,
  ------------------
  |  |  129|  7.06k|#define VIPS_TYPE_FOREIGN_HEIF_COMPRESSION (vips_foreign_heif_compression_get_type())
  ------------------
  745|  7.06k|			compression));
  746|       |
  747|  7.06k|	vips_image_set_int(out, VIPS_META_BITS_PER_SAMPLE, heif->bits_per_pixel);
  ------------------
  |  |  100|  7.06k|#define VIPS_META_BITS_PER_SAMPLE "bits-per-sample"
  ------------------
  748|       |
  749|       |	/* Deprecated "heif-bitdepth" use "bits-per-sample" instead.
  750|       |	 */
  751|  7.06k|	vips_image_set_int(out, "heif-bitdepth", heif->bits_per_pixel);
  752|       |
  753|  7.06k|	if (heif->bits_per_pixel > 8) {
  ------------------
  |  Branch (753:6): [True: 641, False: 6.42k]
  ------------------
  754|    641|		interpretation = VIPS_INTERPRETATION_RGB16;
  755|    641|		format = VIPS_FORMAT_USHORT;
  756|    641|	}
  757|  6.42k|	else {
  758|  6.42k|		interpretation = VIPS_INTERPRETATION_sRGB;
  759|  6.42k|		format = VIPS_FORMAT_UCHAR;
  760|  6.42k|	}
  761|       |
  762|       |	/* FIXME .. we always decode to RGB in generate. We should check for
  763|       |	 * all grey images, perhaps.
  764|       |	 */
  765|  7.06k|	if (vips_image_pipelinev(out, VIPS_DEMAND_STYLE_THINSTRIP, NULL))
  ------------------
  |  Branch (765:6): [True: 0, False: 7.06k]
  ------------------
  766|      0|		return -1;
  767|  7.06k|	vips_image_init_fields(out,
  768|  7.06k|		heif->page_width, heif->page_height * heif->n, bands,
  769|  7.06k|		format, VIPS_CODING_NONE, interpretation,
  770|  7.06k|		1.0, 1.0);
  771|       |
  772|  7.06k|	VIPS_SETSTR(load->out->filename,
  ------------------
  |  |   53|  7.06k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  7.06k|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|  7.06k|	{ \
  |  |   55|  7.06k|		const char *sst = (V); \
  |  |   56|  7.06k|		\
  |  |   57|  7.06k|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 3.53k, False: 3.52k]
  |  |  ------------------
  |  |   58|  3.53k|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 3.53k]
  |  |  |  Branch (58:16): [True: 3.53k, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|  3.53k|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|  3.53k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|  3.53k|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  3.53k|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|  3.53k|	{ \
  |  |  |  |  |  |   43|  3.53k|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 3.53k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  3.53k|			(void) F((S)); \
  |  |  |  |  |  |   45|  3.53k|			(S) = 0; \
  |  |  |  |  |  |   46|  3.53k|		} \
  |  |  |  |  |  |   47|  3.53k|	} \
  |  |  |  |  |  |   48|  3.53k|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|  3.53k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|  3.53k|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 3.53k]
  |  |  ------------------
  |  |   61|  3.53k|					(S) = g_strdup(sst); \
  |  |   62|  3.53k|			} \
  |  |   63|  3.53k|		} \
  |  |   64|  7.06k|	} \
  |  |   65|  7.06k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.06k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  773|  7.06k|		vips_connection_filename(VIPS_CONNECTION(heif->source)));
  774|       |
  775|  7.06k|	return 0;
  776|  7.06k|}
heifload.c:vips_foreign_load_heif_load:
 1030|  3.52k|{
 1031|  3.52k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) load;
 1032|       |
 1033|  3.52k|	VipsImage **t = (VipsImage **)
 1034|  3.52k|		vips_object_local_array(VIPS_OBJECT(load), 3);
  ------------------
  |  |  433|  3.52k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  3.52k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  3.52k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1035|       |
 1036|       |#ifdef DEBUG
 1037|       |	printf("vips_foreign_load_heif_load: loading image\n");
 1038|       |#endif /*DEBUG*/
 1039|       |
 1040|  3.52k|	t[0] = vips_image_new();
 1041|  3.52k|	if (vips_foreign_load_heif_set_header(heif, t[0]))
  ------------------
  |  Branch (1041:6): [True: 0, False: 3.52k]
  ------------------
 1042|      0|		return -1;
 1043|       |
 1044|       |	/* Close input immediately at end of read.
 1045|       |	 */
 1046|  3.52k|	g_signal_connect(t[0], "minimise",
  ------------------
  |  |  491|  3.52k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
 1047|  3.52k|		G_CALLBACK(vips_foreign_load_heif_minimise), heif);
 1048|       |
 1049|  3.52k|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (1049:6): [True: 0, False: 3.52k]
  ------------------
 1050|  3.52k|			NULL, vips_foreign_load_heif_generate, NULL, heif, NULL) ||
 1051|  3.52k|		vips_sequential(t[0], &t[1], NULL) ||
  ------------------
  |  Branch (1051:3): [True: 0, False: 3.52k]
  ------------------
 1052|  3.52k|		vips_image_write(t[1], load->real))
  ------------------
  |  Branch (1052:3): [True: 3.52k, False: 0]
  ------------------
 1053|  3.52k|		return -1;
 1054|       |
 1055|      0|	if (vips_source_decode(heif->source))
  ------------------
  |  Branch (1055:6): [True: 0, False: 0]
  ------------------
 1056|      0|		return -1;
 1057|       |
 1058|      0|	return 0;
 1059|      0|}
heifload.c:vips_foreign_load_heif_minimise:
 1024|  7.05k|{
 1025|  7.05k|	vips_source_minimise(heif->source);
 1026|  7.05k|}
heifload.c:vips_foreign_load_heif_generate:
  930|  3.52k|{
  931|  3.52k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) a;
  932|  3.52k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(heif);
  ------------------
  |  |  441|  3.52k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  3.52k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  3.52k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  933|  3.52k|	VipsRect *r = &out_region->valid;
  934|       |
  935|  3.52k|	int page = r->top / heif->page_height + heif->page;
  936|  3.52k|	int line = r->top % heif->page_height;
  937|       |
  938|       |#ifdef DEBUG_VERBOSE
  939|       |	printf("vips_foreign_load_heif_generate: line %d\n", r->top);
  940|       |#endif /*DEBUG_VERBOSE*/
  941|       |
  942|  3.52k|	g_assert(r->height == 1);
  ------------------
  |  |  166|  3.52k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  3.52k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.52k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  943|       |
  944|  3.52k|	if (vips_foreign_load_heif_set_page(heif, page, heif->thumbnail))
  ------------------
  |  Branch (944:6): [True: 0, False: 3.52k]
  ------------------
  945|      0|		return -1;
  946|       |
  947|  3.52k|	if (!heif->img) {
  ------------------
  |  Branch (947:6): [True: 3.52k, False: 0]
  ------------------
  948|  3.52k|		enum heif_chroma chroma =
  949|  3.52k|			vips__heif_chroma(heif->bits_per_pixel, heif->has_alpha);
  950|       |
  951|  3.52k|		struct heif_error error;
  952|  3.52k|		struct heif_decoding_options *options;
  953|       |
  954|  3.52k|		options = heif_decoding_options_alloc();
  955|  3.52k|		error = heif_decode_image(heif->handle, &heif->img,
  956|  3.52k|			heif_colorspace_RGB,
  957|  3.52k|			chroma,
  958|  3.52k|			options);
  959|  3.52k|		heif_decoding_options_free(options);
  960|  3.52k|		if (error.code) {
  ------------------
  |  Branch (960:7): [True: 3.52k, False: 2]
  ------------------
  961|  3.52k|			vips__heif_error(&error);
  962|  3.52k|			return -1;
  963|  3.52k|		}
  964|       |
  965|       |#ifdef DEBUG
  966|       |		vips__heif_image_print(heif->img);
  967|       |#endif /*DEBUG*/
  968|  3.52k|	}
  969|       |
  970|      2|	if (!heif->data) {
  ------------------
  |  Branch (970:6): [True: 2, False: 0]
  ------------------
  971|      2|		int image_width = heif_image_get_width(heif->img,
  972|      2|			heif_channel_interleaved);
  973|      2|		int image_height = heif_image_get_height(heif->img,
  974|      2|			heif_channel_interleaved);
  975|       |
  976|       |		/* We can sometimes get inconsistency between the dimensions
  977|       |		 * reported on the handle, and the final image we fetch. Error
  978|       |		 * out to prevent a segv.
  979|       |		 */
  980|      2|		if (image_width != heif->page_width ||
  ------------------
  |  Branch (980:7): [True: 2, False: 0]
  ------------------
  981|      2|			image_height != heif->page_height) {
  ------------------
  |  Branch (981:4): [True: 0, False: 0]
  ------------------
  982|      2|			vips_error(class->nickname,
  983|      2|				"%s", _("bad image dimensions on decode"));
  ------------------
  |  |   30|      2|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      2|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  984|      2|			return -1;
  985|      2|		}
  986|       |
  987|      0|		if (!(heif->data = heif_image_get_plane_readonly(heif->img,
  ------------------
  |  Branch (987:7): [True: 0, False: 0]
  ------------------
  988|      0|				  heif_channel_interleaved, &heif->stride))) {
  989|      0|			vips_error(class->nickname,
  990|      0|				"%s", _("unable to get image data"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  991|      0|			return -1;
  992|      0|		}
  993|      0|	}
  994|       |
  995|      0|	memcpy(VIPS_REGION_ADDR(out_region, 0, r->top),
  ------------------
  |  |  227|      0|	((R)->data + \
  |  |  228|      0|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|      0|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|      0|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|      0|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|      0|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|      0|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  996|      0|		heif->data + heif->stride * line,
  997|      0|		VIPS_IMAGE_SIZEOF_LINE(out_region->im));
  ------------------
  |  |  386|      0|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|      0|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|      0|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  998|       |
  999|       |	/* We may need to swap bytes and shift to fill 16 bits.
 1000|       |	 */
 1001|      0|	if (heif->bits_per_pixel > 8) {
  ------------------
  |  Branch (1001:6): [True: 0, False: 0]
  ------------------
 1002|      0|		int shift = 16 - heif->bits_per_pixel;
 1003|      0|		int ne = VIPS_REGION_N_ELEMENTS(out_region);
  ------------------
  |  |  197|      0|	((size_t) ((R)->valid.width * (R)->im->Bands))
  ------------------
 1004|       |
 1005|      0|		int i;
 1006|      0|		VipsPel *p;
 1007|       |
 1008|      0|		p = VIPS_REGION_ADDR(out_region, 0, r->top);
  ------------------
  |  |  227|      0|	((R)->data + \
  |  |  228|      0|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|      0|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|      0|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|      0|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|      0|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|      0|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1009|      0|		for (i = 0; i < ne; i++) {
  ------------------
  |  Branch (1009:15): [True: 0, False: 0]
  ------------------
 1010|       |			/* We've asked for big endian, we must write native.
 1011|       |			 */
 1012|      0|			guint16 v = ((p[0] << 8) | p[1]) << shift;
 1013|       |
 1014|      0|			*((guint16 *) p) = v;
 1015|      0|			p += 2;
 1016|      0|		}
 1017|      0|	}
 1018|       |
 1019|      0|	return 0;
 1020|      2|}
heifload.c:vips_foreign_load_heif_init:
 1195|  4.14k|{
 1196|  4.14k|	heif->n = 1;
 1197|       |
 1198|  4.14k|	heif->reader = VIPS_ARRAY(NULL, 1, struct heif_reader);
  ------------------
  |  |   72|  4.14k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  4.14k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  4.14k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  4.14k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  4.14k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1199|       |
 1200|       |	/* The first version to support heif_reader.
 1201|       |	 */
 1202|  4.14k|	heif->reader->reader_api_version = 1;
 1203|  4.14k|	heif->reader->get_position = vips_foreign_load_heif_get_position;
 1204|  4.14k|	heif->reader->read = vips_foreign_load_heif_read;
 1205|  4.14k|	heif->reader->seek = vips_foreign_load_heif_seek;
 1206|  4.14k|	heif->reader->wait_for_file_size =
 1207|  4.14k|		vips_foreign_load_heif_wait_for_file_size;
 1208|  4.14k|}
heifload.c:vips_foreign_load_heif_get_position:
 1122|   122k|{
 1123|   122k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
 1124|       |
 1125|   122k|	return vips_source_seek(heif->source, 0L, SEEK_CUR);
 1126|   122k|}
heifload.c:vips_foreign_load_heif_read:
 1135|   334k|{
 1136|   334k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
 1137|       |
 1138|   666k|	while (size > 0) {
  ------------------
  |  Branch (1138:9): [True: 331k, False: 334k]
  ------------------
 1139|   331k|		gint64 bytes_read;
 1140|       |
 1141|   331k|		bytes_read = vips_source_read(heif->source, data, size);
 1142|   331k|		if (bytes_read <= 0)
  ------------------
  |  Branch (1142:7): [True: 49, False: 331k]
  ------------------
 1143|     49|			return -1;
 1144|       |
 1145|   331k|		size -= bytes_read;
 1146|   331k|		data = (char *) data + bytes_read;
 1147|   331k|	}
 1148|       |
 1149|   334k|	return 0;
 1150|   334k|}
heifload.c:vips_foreign_load_heif_seek:
 1154|  22.9k|{
 1155|  22.9k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
 1156|       |
 1157|       |	/* Return 0 on success.
 1158|       |	 */
 1159|  22.9k|	return vips_source_seek(heif->source, position, SEEK_SET) == -1;
 1160|  22.9k|}
heifload.c:vips_foreign_load_heif_wait_for_file_size:
 1167|   125k|{
 1168|   125k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
 1169|       |
 1170|   125k|	gint64 old_position;
 1171|   125k|	gint64 result;
 1172|   125k|	enum heif_reader_grow_status status;
 1173|       |
 1174|       |	/* We seek the VipsSource to the position and check for errors.
 1175|       |	 */
 1176|   125k|	old_position = vips_source_seek(heif->source, 0L, SEEK_CUR);
 1177|   125k|	result = vips_source_seek(heif->source, target_size, SEEK_SET);
 1178|   125k|	vips_source_seek(heif->source, old_position, SEEK_SET);
 1179|       |
 1180|   125k|	if (result < 0)
  ------------------
  |  Branch (1180:6): [True: 269, False: 124k]
  ------------------
 1181|       |		/* Unable to seek to this point, so it's beyond EOF.
 1182|       |		 */
 1183|    269|		status = heif_reader_grow_status_size_beyond_eof;
 1184|   124k|	else
 1185|       |		/* Successfully read to the requested point, but the requested
 1186|       |		 * point is not necessarily EOF.
 1187|       |		 */
 1188|   124k|		status = heif_reader_grow_status_size_reached;
 1189|       |
 1190|   125k|	return status;
 1191|   125k|}
heifload.c:vips_foreign_load_heif_file_class_init:
 1254|      1|{
 1255|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1256|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1257|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
 1258|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
 1259|       |
 1260|      1|	gobject_class->set_property = vips_object_set_property;
 1261|      1|	gobject_class->get_property = vips_object_get_property;
 1262|       |
 1263|      1|	object_class->nickname = "heifload";
 1264|      1|	object_class->build = vips_foreign_load_heif_file_build;
 1265|       |
 1266|      1|	foreign_class->suffs = vips__heif_suffs;
 1267|       |
 1268|      1|	load_class->is_a = vips_foreign_load_heif_file_is_a;
 1269|       |
 1270|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1271|      1|		_("Filename"),
 1272|      1|		_("Filename to load from"),
 1273|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1274|      1|		G_STRUCT_OFFSET(VipsForeignLoadHeifFile, filename),
 1275|      1|		NULL);
 1276|      1|}
heifload.c:vips_foreign_load_heif_is_a:
  393|  6.33k|{
  394|  6.33k|	if (len >= 12) {
  ------------------
  |  Branch (394:6): [True: 6.27k, False: 64]
  ------------------
  395|  6.27k|		unsigned char *p = (unsigned char *) buf;
  396|  6.27k|		guint32 chunk_len =
  397|  6.27k|			VIPS_LSHIFT_INT(p[0], 24) |
  ------------------
  |  |   87|  6.27k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  398|  6.27k|			VIPS_LSHIFT_INT(p[1], 16) |
  ------------------
  |  |   87|  6.27k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  399|  6.27k|			VIPS_LSHIFT_INT(p[2], 8) |
  ------------------
  |  |   87|  6.27k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  400|  6.27k|			VIPS_LSHIFT_INT(p[3], 0);
  ------------------
  |  |   87|  6.27k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  401|       |
  402|  6.27k|		int i;
  403|       |
  404|       |		/* chunk_len can be pretty big for eg. animated AVIF.
  405|       |		 */
  406|  6.27k|		if (chunk_len > 2048 ||
  ------------------
  |  Branch (406:7): [True: 2.10k, False: 4.16k]
  ------------------
  407|  6.27k|			chunk_len % 4 != 0)
  ------------------
  |  Branch (407:4): [True: 2, False: 4.16k]
  ------------------
  408|  2.11k|			return 0;
  409|       |
  410|  33.0k|		for (i = 0; i < VIPS_NUMBER(heif_magic); i++)
  ------------------
  |  |   60|  33.0k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (410:15): [True: 32.9k, False: 23]
  ------------------
  411|  32.9k|			if (strncmp(buf + 4, heif_magic[i], 8) == 0)
  ------------------
  |  Branch (411:8): [True: 4.14k, False: 28.8k]
  ------------------
  412|  4.14k|				return 1;
  413|  4.16k|	}
  414|       |
  415|     87|	return 0;
  416|  6.33k|}
heifload.c:vips_foreign_load_heif_buffer_class_init:
 1326|      1|{
 1327|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1328|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1329|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
 1330|       |
 1331|      1|	gobject_class->set_property = vips_object_set_property;
 1332|      1|	gobject_class->get_property = vips_object_get_property;
 1333|       |
 1334|      1|	object_class->nickname = "heifload_buffer";
 1335|      1|	object_class->build = vips_foreign_load_heif_buffer_build;
 1336|       |
 1337|      1|	load_class->is_a_buffer = vips_foreign_load_heif_buffer_is_a;
 1338|       |
 1339|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
 1340|      1|		_("Buffer"),
 1341|      1|		_("Buffer to load from"),
 1342|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1343|      1|		G_STRUCT_OFFSET(VipsForeignLoadHeifBuffer, buf),
 1344|      1|		VIPS_TYPE_BLOB);
 1345|      1|}
heifload.c:vips_foreign_load_heif_buffer_build:
 1299|  4.14k|{
 1300|  4.14k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) object;
 1301|  4.14k|	VipsForeignLoadHeifBuffer *buffer =
 1302|  4.14k|		(VipsForeignLoadHeifBuffer *) object;
 1303|       |
 1304|  4.14k|	if (buffer->buf &&
  ------------------
  |  Branch (1304:6): [True: 4.14k, False: 0]
  ------------------
 1305|  4.14k|		!(heif->source = vips_source_new_from_memory(
  ------------------
  |  Branch (1305:3): [True: 0, False: 4.14k]
  ------------------
 1306|  4.14k|			VIPS_AREA(buffer->buf)->data,
  ------------------
  |  |  137|  4.14k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1307|  4.14k|			VIPS_AREA(buffer->buf)->length)))
  ------------------
  |  |  137|  4.14k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1308|      0|		return -1;
 1309|       |
 1310|  4.14k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_heif_file_parent_class)
  ------------------
  |  |  435|  4.14k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  4.14k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  4.14k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1310:6): [True: 604, False: 3.53k]
  ------------------
 1311|  4.14k|			->build(object))
 1312|    604|		return -1;
 1313|       |
 1314|  3.53k|	return 0;
 1315|  4.14k|}
heifload.c:vips_foreign_load_heif_buffer_is_a:
 1319|  6.33k|{
 1320|  6.33k|	return vips_foreign_load_heif_is_a(buf, len);
 1321|  6.33k|}
heifload.c:vips_foreign_load_heif_buffer_init:
 1349|  4.14k|{
 1350|  4.14k|}
heifload.c:vips_foreign_load_heif_source_class_init:
 1397|      1|{
 1398|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1399|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1400|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
 1401|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
 1402|       |
 1403|      1|	gobject_class->set_property = vips_object_set_property;
 1404|      1|	gobject_class->get_property = vips_object_get_property;
 1405|       |
 1406|      1|	object_class->nickname = "heifload_source";
 1407|      1|	object_class->build = vips_foreign_load_heif_source_build;
 1408|       |
 1409|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
 1410|       |
 1411|      1|	load_class->is_a_source = vips_foreign_load_heif_source_is_a_source;
 1412|       |
 1413|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
 1414|      1|		_("Source"),
 1415|      1|		_("Source to load from"),
 1416|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1417|      1|		G_STRUCT_OFFSET(VipsForeignLoadHeifSource, source),
 1418|      1|		VIPS_TYPE_SOURCE);
 1419|      1|}

heifsave.c:vips_foreign_save_heif_class_init:
  755|      1|{
  756|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  757|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  758|      1|	VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
  759|       |
  760|      1|	vips__heif_init();
  761|       |
  762|      1|	gobject_class->dispose = vips_foreign_save_heif_dispose;
  763|      1|	gobject_class->set_property = vips_object_set_property;
  764|      1|	gobject_class->get_property = vips_object_get_property;
  765|       |
  766|      1|	object_class->nickname = "heifsave_base";
  767|      1|	object_class->description = _("save image in HEIF format");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  768|      1|	object_class->build = vips_foreign_save_heif_build;
  769|       |
  770|      1|	save_class->saveable = VIPS_SAVEABLE_RGBA_ONLY;
  771|      1|	save_class->format_table = vips_heif_bandfmt;
  772|       |
  773|      1|	VIPS_ARG_INT(class, "Q", 10,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  774|      1|		_("Q"),
  775|      1|		_("Q factor"),
  776|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  777|      1|		G_STRUCT_OFFSET(VipsForeignSaveHeif, Q),
  778|      1|		1, 100, 50);
  779|       |
  780|      1|	VIPS_ARG_INT(class, "bitdepth", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  781|      1|		_("Bit depth"),
  782|      1|		_("Number of bits per pixel"),
  783|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  784|      1|		G_STRUCT_OFFSET(VipsForeignSaveHeif, bitdepth),
  785|      1|		8, 12, 12);
  786|       |
  787|      1|	VIPS_ARG_BOOL(class, "lossless", 13,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  788|      1|		_("Lossless"),
  789|      1|		_("Enable lossless compression"),
  790|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  791|      1|		G_STRUCT_OFFSET(VipsForeignSaveHeif, lossless),
  792|      1|		FALSE);
  793|       |
  794|      1|	VIPS_ARG_ENUM(class, "compression", 14,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  795|      1|		_("Compression"),
  796|      1|		_("Compression format"),
  797|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  798|      1|		G_STRUCT_OFFSET(VipsForeignSaveHeif, compression),
  799|      1|		VIPS_TYPE_FOREIGN_HEIF_COMPRESSION,
  800|      1|		VIPS_FOREIGN_HEIF_COMPRESSION_HEVC);
  801|       |
  802|      1|	VIPS_ARG_INT(class, "effort", 15,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  803|      1|		_("Effort"),
  804|      1|		_("CPU effort"),
  805|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  806|      1|		G_STRUCT_OFFSET(VipsForeignSaveHeif, effort),
  807|      1|		0, 9, 4);
  808|       |
  809|      1|	VIPS_ARG_ENUM(class, "subsample_mode", 16,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  810|      1|		_("Subsample mode"),
  811|      1|		_("Select chroma subsample operation mode"),
  812|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  813|      1|		G_STRUCT_OFFSET(VipsForeignSaveHeif, subsample_mode),
  814|      1|		VIPS_TYPE_FOREIGN_SUBSAMPLE,
  815|      1|		VIPS_FOREIGN_SUBSAMPLE_AUTO);
  816|       |
  817|      1|	VIPS_ARG_INT(class, "speed", 17,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  818|      1|		_("Speed"),
  819|      1|		_("CPU effort"),
  820|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  821|      1|		G_STRUCT_OFFSET(VipsForeignSaveHeif, speed),
  822|      1|		0, 9, 5);
  823|       |
  824|      1|	VIPS_ARG_ENUM(class, "encoder", 18,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  825|      1|		_("Encoder"),
  826|      1|		_("Select encoder to use"),
  827|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  828|      1|		G_STRUCT_OFFSET(VipsForeignSaveHeif, selected_encoder),
  829|      1|		VIPS_TYPE_FOREIGN_HEIF_ENCODER,
  830|      1|		VIPS_FOREIGN_HEIF_ENCODER_AUTO);
  831|      1|}
heifsave.c:vips_foreign_save_heif_file_class_init:
  883|      1|{
  884|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  885|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  886|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  887|       |
  888|      1|	gobject_class->set_property = vips_object_set_property;
  889|      1|	gobject_class->get_property = vips_object_get_property;
  890|       |
  891|      1|	object_class->nickname = "heifsave";
  892|      1|	object_class->build = vips_foreign_save_heif_file_build;
  893|       |
  894|      1|	foreign_class->suffs = vips__heif_suffs;
  895|       |
  896|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  897|      1|		_("Filename"),
  898|      1|		_("Filename to save to"),
  899|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  900|      1|		G_STRUCT_OFFSET(VipsForeignSaveHeifFile, filename),
  901|      1|		NULL);
  902|      1|}
heifsave.c:vips_foreign_save_heif_buffer_class_init:
  948|      1|{
  949|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  950|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  951|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  952|       |
  953|      1|	gobject_class->set_property = vips_object_set_property;
  954|      1|	gobject_class->get_property = vips_object_get_property;
  955|       |
  956|      1|	object_class->nickname = "heifsave_buffer";
  957|      1|	object_class->build = vips_foreign_save_heif_buffer_build;
  958|       |
  959|      1|	foreign_class->suffs = vips__heic_suffs;
  960|       |
  961|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  962|      1|		_("Buffer"),
  963|      1|		_("Buffer to save to"),
  964|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  965|      1|		G_STRUCT_OFFSET(VipsForeignSaveHeifBuffer, buf),
  966|      1|		VIPS_TYPE_BLOB);
  967|      1|}
heifsave.c:vips_foreign_save_heif_target_class_init:
 1006|      1|{
 1007|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1008|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1009|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
 1010|       |
 1011|      1|	gobject_class->set_property = vips_object_set_property;
 1012|      1|	gobject_class->get_property = vips_object_get_property;
 1013|       |
 1014|      1|	object_class->nickname = "heifsave_target";
 1015|      1|	object_class->build = vips_foreign_save_heif_target_build;
 1016|       |
 1017|      1|	foreign_class->suffs = vips__heic_suffs;
 1018|       |
 1019|      1|	VIPS_ARG_OBJECT(class, "target", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
 1020|      1|		_("Target"),
 1021|      1|		_("Target to save to"),
 1022|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1023|      1|		G_STRUCT_OFFSET(VipsForeignSaveHeifTarget, target),
 1024|      1|		VIPS_TYPE_TARGET);
 1025|      1|}
heifsave.c:vips_foreign_save_avif_target_class_init:
 1041|      1|{
 1042|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1043|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
 1044|      1|	VipsOperationClass *operation_class = (VipsOperationClass *) class;
 1045|       |
 1046|      1|	object_class->nickname = "avifsave_target";
 1047|      1|	object_class->description = _("save image in AVIF format");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1048|       |
 1049|      1|	foreign_class->suffs = vips__avif_suffs;
 1050|       |
 1051|       |	/* Hide from UI.
 1052|       |	 */
 1053|      1|	operation_class->flags |= VIPS_OPERATION_DEPRECATED;
 1054|      1|}

vips__jpeg_read_source:
 1054|  5.35k|{
 1055|  5.35k|	ReadJpeg *jpeg;
 1056|       |
 1057|  5.35k|	if (!(jpeg = readjpeg_new(source, out, shrink, fail_on,
  ------------------
  |  Branch (1057:6): [True: 0, False: 5.35k]
  ------------------
 1058|  5.35k|			  autorotate, unlimited)))
 1059|      0|		return -1;
 1060|       |
 1061|       |	/* Here for longjmp() from vips__new_error_exit() during
 1062|       |	 * cinfo->mem->alloc_small() or jpeg_read_header().
 1063|       |	 */
 1064|  5.35k|	if (setjmp(jpeg->eman.jmp))
 1065|    518|		return -1;
 1066|       |
 1067|  4.83k|	if (readjpeg_open_input(jpeg) ||
  ------------------
  |  Branch (1067:6): [True: 18.4E, False: 5.35k]
  ------------------
 1068|  5.35k|		vips__jpeg_read(jpeg, out, header_only))
  ------------------
  |  Branch (1068:3): [True: 1.92k, False: 3.43k]
  ------------------
 1069|  1.40k|		return -1;
 1070|       |
 1071|  3.43k|	if (header_only)
  ------------------
  |  Branch (1071:6): [True: 2.54k, False: 886]
  ------------------
 1072|  2.54k|		vips_source_minimise(source);
 1073|       |
 1074|  3.43k|	return 0;
 1075|  4.83k|}
vips__isjpeg_source:
 1079|  14.2k|{
 1080|  14.2k|	const unsigned char *p;
 1081|       |
 1082|  14.2k|	if ((p = vips_source_sniff(source, 2)) &&
  ------------------
  |  Branch (1082:6): [True: 14.2k, False: 6]
  ------------------
 1083|  14.2k|		p[0] == 0xff &&
  ------------------
  |  Branch (1083:3): [True: 3.08k, False: 11.2k]
  ------------------
 1084|  14.2k|		p[1] == 0xd8)
  ------------------
  |  Branch (1084:3): [True: 3.06k, False: 20]
  ------------------
 1085|  3.06k|		return 1;
 1086|       |
 1087|  11.2k|	return 0;
 1088|  14.2k|}
jpeg2vips.c:readjpeg_new:
  454|  5.35k|{
  455|  5.35k|	ReadJpeg *jpeg;
  456|       |
  457|  5.35k|	if (!(jpeg = VIPS_NEW(out, ReadJpeg)))
  ------------------
  |  |   70|  5.35k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  5.35k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  5.35k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  5.35k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  5.35k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (457:6): [True: 0, False: 5.35k]
  ------------------
  458|      0|		return NULL;
  459|       |
  460|  5.35k|	jpeg->out = out;
  461|  5.35k|	jpeg->source = source;
  462|  5.35k|	g_object_ref(source);
  463|  5.35k|	jpeg->shrink = shrink;
  464|  5.35k|	jpeg->fail_on = fail_on;
  465|  5.35k|	jpeg->cinfo.err = jpeg_std_error(&jpeg->eman.pub);
  466|  5.35k|	jpeg->cinfo.err->addon_message_table = vips__jpeg_message_table;
  467|  5.35k|	jpeg->cinfo.err->first_addon_message = 1000;
  468|  5.35k|	jpeg->cinfo.err->last_addon_message = 1001;
  469|  5.35k|	jpeg->eman.pub.error_exit = vips__new_error_exit;
  470|  5.35k|	jpeg->eman.pub.emit_message = readjpeg_emit_message;
  471|  5.35k|	jpeg->eman.pub.output_message = vips__new_output_message;
  472|  5.35k|	jpeg->eman.fp = NULL;
  473|  5.35k|	jpeg->autorotate = autorotate;
  474|  5.35k|	jpeg->unlimited = unlimited;
  475|  5.35k|	jpeg->cinfo.client_data = jpeg;
  476|       |
  477|       |	/* jpeg_create_decompress() can fail on some sanity checks. Don't
  478|       |	 * readjpeg_free() since we don't want to jpeg_destroy_decompress().
  479|       |	 */
  480|  5.35k|	if (setjmp(jpeg->eman.jmp))
  481|      0|		return NULL;
  482|       |
  483|  5.35k|	jpeg_create_decompress(&jpeg->cinfo);
  ------------------
  |  |  972|  5.35k|  jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
  |  |  ------------------
  |  |  |  |    4|  5.35k|#define JPEG_LIB_VERSION  62
  |  |  ------------------
  |  |  973|  5.35k|                        (size_t)sizeof(struct jpeg_decompress_struct))
  ------------------
  484|       |
  485|  5.35k|	g_signal_connect(out, "close",
  ------------------
  |  |  491|  5.35k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  486|  5.35k|		G_CALLBACK(readjpeg_close_cb), jpeg);
  487|  5.35k|	g_signal_connect(out, "minimise",
  ------------------
  |  |  491|  5.35k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  488|  5.35k|		G_CALLBACK(readjpeg_minimise_cb), jpeg);
  489|       |
  490|  5.35k|	return jpeg;
  491|  5.35k|}
jpeg2vips.c:readjpeg_emit_message:
  383|   170k|{
  384|   170k|	ReadJpeg *jpeg = (ReadJpeg *) cinfo->client_data;
  385|       |
  386|   170k|	long num_warnings;
  387|       |
  388|   170k|	if (msg_level < 0) {
  ------------------
  |  Branch (388:6): [True: 60.4k, False: 110k]
  ------------------
  389|       |		/* Always count warnings in num_warnings.
  390|       |		 */
  391|  60.4k|		num_warnings = ++cinfo->err->num_warnings;
  392|       |
  393|       |		/* Corrupt files may give many warnings, the policy here is to
  394|       |		 * show only the first warning and treat many warnings as fatal,
  395|       |		 * unless unlimited is set.
  396|       |		 */
  397|  60.4k|		if (num_warnings == 1)
  ------------------
  |  Branch (397:7): [True: 5.22k, False: 55.1k]
  ------------------
  398|  5.22k|			(*cinfo->err->output_message)(cinfo);
  399|  55.1k|		else if (!jpeg ||
  ------------------
  |  Branch (399:12): [True: 0, False: 55.1k]
  ------------------
  400|  55.1k|			(!jpeg->unlimited && num_warnings >= 100))
  ------------------
  |  Branch (400:5): [True: 55.1k, False: 0]
  |  Branch (400:25): [True: 146, False: 55.0k]
  ------------------
  401|    146|			cinfo->err->error_exit(cinfo);
  402|  60.4k|	}
  403|   110k|	else if (cinfo->err->trace_level >= msg_level)
  ------------------
  |  Branch (403:11): [True: 0, False: 110k]
  ------------------
  404|       |		/* It's a trace message. Show it if trace_level >= msg_level.
  405|       |		 */
  406|      0|		(*cinfo->err->output_message)(cinfo);
  407|   170k|}
jpeg2vips.c:readjpeg_close_cb:
  440|  5.35k|{
  441|  5.35k|	(void) readjpeg_free(jpeg);
  442|  5.35k|}
jpeg2vips.c:readjpeg_free:
  413|  5.35k|{
  414|  5.35k|	if (jpeg->eman.pub.num_warnings != 0) {
  ------------------
  |  Branch (414:6): [True: 5.22k, False: 134]
  ------------------
  415|  5.22k|		g_warning(_("read gave %ld warnings"),
  ------------------
  |  |  338|  5.22k|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  5.22k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|  5.22k|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|  5.22k|                               __VA_ARGS__)
  ------------------
  416|  5.22k|			jpeg->eman.pub.num_warnings);
  417|  5.22k|		g_warning("%s", vips_error_buffer());
  ------------------
  |  |  338|  5.22k|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  5.22k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|  5.22k|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|  5.22k|                               __VA_ARGS__)
  ------------------
  418|       |
  419|       |		/* Make the message only appear once.
  420|       |		 */
  421|  5.22k|		jpeg->eman.pub.num_warnings = 0;
  422|  5.22k|	}
  423|       |
  424|       |	/* Don't call jpeg_finish_decompress(). It just checks the tail of the
  425|       |	 * file and who cares about that. All mem is freed in
  426|       |	 * jpeg_destroy_decompress().
  427|       |	 */
  428|       |
  429|       |	/* I don't think this can fail. It's harmless to call many times.
  430|       |	 */
  431|  5.35k|	jpeg_destroy_decompress(&jpeg->cinfo);
  432|       |
  433|  5.35k|	VIPS_UNREF(jpeg->source);
  ------------------
  |  |   57|  5.35k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  5.35k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  5.35k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  5.35k|	{ \
  |  |  |  |   43|  5.35k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 5.35k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  5.35k|			(void) F((S)); \
  |  |  |  |   45|  5.35k|			(S) = 0; \
  |  |  |  |   46|  5.35k|		} \
  |  |  |  |   47|  5.35k|	} \
  |  |  |  |   48|  5.35k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  5.35k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  434|       |
  435|  5.35k|	return 0;
  436|  5.35k|}
jpeg2vips.c:readjpeg_minimise_cb:
  446|  8.64k|{
  447|  8.64k|	vips_source_minimise(jpeg->source);
  448|  8.64k|}
jpeg2vips.c:readjpeg_open_input:
  328|  5.35k|{
  329|  5.35k|	j_decompress_ptr cinfo = &jpeg->cinfo;
  330|       |
  331|  5.35k|	if (jpeg->source &&
  ------------------
  |  Branch (331:6): [True: 5.35k, False: 0]
  ------------------
  332|  5.35k|		!cinfo->src) {
  ------------------
  |  Branch (332:3): [True: 5.35k, False: 0]
  ------------------
  333|  5.35k|		Source *src;
  334|       |
  335|  5.35k|		if (vips_source_rewind(jpeg->source))
  ------------------
  |  Branch (335:7): [True: 0, False: 5.35k]
  ------------------
  336|      0|			return -1;
  337|       |
  338|  5.35k|		cinfo->src =
  339|  5.35k|			(struct jpeg_source_mgr *) (*cinfo->mem->alloc_small)(
  340|  5.35k|				(j_common_ptr) cinfo,
  341|  5.35k|				JPOOL_PERMANENT,
  ------------------
  |  |  888|  5.35k|#define JPOOL_PERMANENT  0      /* lasts until master record is destroyed */
  ------------------
  342|  5.35k|				sizeof(Source));
  343|       |
  344|  5.35k|		src = (Source *) cinfo->src;
  345|  5.35k|		src->jpeg = jpeg;
  346|  5.35k|		src->source = jpeg->source;
  347|  5.35k|		src->pub.init_source = source_init_source;
  348|       |
  349|       |		/* Use default method.
  350|       |		 */
  351|  5.35k|		src->pub.resync_to_restart = jpeg_resync_to_restart;
  352|       |
  353|  5.35k|		if (vips_source_is_mappable(jpeg->source)) {
  ------------------
  |  Branch (353:7): [True: 5.35k, False: 0]
  ------------------
  354|  5.35k|			size_t src_len;
  355|  5.35k|			const unsigned char *src_data = vips_source_map(
  356|  5.35k|				jpeg->source, &src_len);
  357|       |
  358|  5.35k|			src->pub.fill_input_buffer =
  359|  5.35k|				source_fill_input_buffer_mappable;
  360|  5.35k|			src->pub.skip_input_data = skip_input_data_mappable;
  361|  5.35k|			src->pub.bytes_in_buffer = src_len;
  362|  5.35k|			src->pub.next_input_byte = src_data;
  363|  5.35k|		}
  364|      0|		else {
  365|      0|			src->pub.fill_input_buffer = source_fill_input_buffer;
  366|      0|			src->pub.skip_input_data = skip_input_data;
  367|       |
  368|       |			/* Forces fill_input_buffer on first read.
  369|       |			 */
  370|      0|			src->pub.bytes_in_buffer = 0;
  371|       |
  372|       |			/* Until buffer loaded.
  373|       |			 */
  374|      0|			src->pub.next_input_byte = NULL;
  375|      0|		}
  376|  5.35k|	}
  377|       |
  378|  5.35k|	return 0;
  379|  5.35k|}
jpeg2vips.c:source_init_source:
  228|  5.35k|{
  229|       |	/* No work necessary here.
  230|       |	 */
  231|  5.35k|}
jpeg2vips.c:source_fill_input_buffer_mappable:
  268|  9.89k|{
  269|  9.89k|	Source *src = (Source *) cinfo->src;
  270|       |
  271|  9.89k|	if (src->jpeg->fail_on >= VIPS_FAIL_ON_TRUNCATED) {
  ------------------
  |  Branch (271:6): [True: 0, False: 9.89k]
  ------------------
  272|       |		/* Knock the output out of cache.
  273|       |		 */
  274|      0|		vips_foreign_load_invalidate(src->jpeg->out);
  275|      0|		ERREXIT(cinfo, JERR_VIPS_IMAGE_EOF);
  ------------------
  |  |  240|      0|  ((cinfo)->err->msg_code = (code), \
  |  |  241|      0|   (*(cinfo)->err->error_exit) ((j_common_ptr)(cinfo)))
  ------------------
  276|      0|	}
  277|  9.89k|	else
  278|  9.89k|		WARNMS(cinfo, JWRN_VIPS_IMAGE_EOF);
  ------------------
  |  |  283|  9.89k|  ((cinfo)->err->msg_code = (code), \
  |  |  284|  9.89k|   (*(cinfo)->err->emit_message) ((j_common_ptr)(cinfo), -1))
  ------------------
  279|       |
  280|       |	/* Insert a fake EOI marker.
  281|       |	 */
  282|  9.89k|	src->buf[0] = (JOCTET) 0xFF;
  283|  9.89k|	src->buf[1] = (JOCTET) JPEG_EOI;
  ------------------
  |  | 1167|  9.89k|#define JPEG_EOI        0xD9    /* EOI marker code */
  ------------------
  284|       |
  285|  9.89k|	src->pub.next_input_byte = src->buf;
  286|  9.89k|	src->pub.bytes_in_buffer = 2;
  287|       |
  288|  9.89k|	return TRUE;
  ------------------
  |  |  209|  9.89k|#define TRUE    1
  ------------------
  289|  9.89k|}
jpeg2vips.c:skip_input_data_mappable:
  313|  1.89k|{
  314|  1.89k|	Source *src = (Source *) cinfo->src;
  315|       |
  316|  1.89k|	if (num_bytes > (long) src->pub.bytes_in_buffer) {
  ------------------
  |  Branch (316:6): [True: 88, False: 1.80k]
  ------------------
  317|     88|		src->pub.next_input_byte += src->pub.bytes_in_buffer;
  318|     88|		src->pub.bytes_in_buffer = 0;
  319|     88|	}
  320|  1.80k|	else {
  321|  1.80k|		src->pub.next_input_byte += (size_t) num_bytes;
  322|  1.80k|		src->pub.bytes_in_buffer -= (size_t) num_bytes;
  323|  1.80k|	}
  324|  1.89k|}
jpeg2vips.c:vips__jpeg_read:
 1002|  5.35k|{
 1003|       |	/* Need to read in APP1 (EXIF metadata), APP2 (ICC profile), APP13
 1004|       |	 * (photoshop IPTC) and APP14 (Adobe flags).
 1005|       |	 */
 1006|  5.35k|	jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + 1, 0xffff);
  ------------------
  |  | 1168|  5.35k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
 1007|  5.35k|	jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + 2, 0xffff);
  ------------------
  |  | 1168|  5.35k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
 1008|  5.35k|	jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + 13, 0xffff);
  ------------------
  |  | 1168|  5.35k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
 1009|  5.35k|	jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + 14, 0xffff);
  ------------------
  |  | 1168|  5.35k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
 1010|       |
 1011|       |#ifdef DEBUG
 1012|       |	{
 1013|       |		int i;
 1014|       |
 1015|       |		/* Handy for debugging ... spot any extra  markers.
 1016|       |		 */
 1017|       |		for (i = 0; i < 16; i++)
 1018|       |			jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + i, 0xffff);
 1019|       |	}
 1020|       |#endif /*DEBUG*/
 1021|       |
 1022|       |	/* Convert!
 1023|       |	 */
 1024|  5.35k|	if (header_only) {
  ------------------
  |  Branch (1024:6): [True: 3.06k, False: 2.29k]
  ------------------
 1025|  3.06k|		if (read_jpeg_header(jpeg, out))
  ------------------
  |  Branch (1025:7): [True: 0, False: 3.06k]
  ------------------
 1026|      0|			return -1;
 1027|       |
 1028|       |		/* Patch in the correct size.
 1029|       |		 */
 1030|  3.06k|		out->Xsize = jpeg->output_width;
 1031|  3.06k|		out->Ysize = jpeg->output_height;
 1032|       |
 1033|       |		/* Swap width and height if we're going to rotate this image.
 1034|       |		 */
 1035|  3.06k|		if (jpeg->autorotate) {
  ------------------
  |  Branch (1035:7): [True: 0, False: 3.06k]
  ------------------
 1036|      0|			if (vips_image_get_orientation_swap(out))
  ------------------
  |  Branch (1036:8): [True: 0, False: 0]
  ------------------
 1037|      0|				VIPS_SWAP(int, out->Xsize, out->Ysize);
  ------------------
  |  |  114|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |  115|      0|	{ \
  |  |  116|      0|		TYPE t = (A); \
  |  |  117|      0|		(A) = (B); \
  |  |  118|      0|		(B) = t; \
  |  |  119|      0|	} \
  |  |  120|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1038|       |
 1039|      0|			vips_autorot_remove_angle(out);
 1040|      0|		}
 1041|  3.06k|	}
 1042|  2.29k|	else {
 1043|  2.29k|		if (read_jpeg_image(jpeg, out))
  ------------------
  |  Branch (1043:7): [True: 1.40k, False: 886]
  ------------------
 1044|  1.40k|			return -1;
 1045|  2.29k|	}
 1046|       |
 1047|  3.94k|	return 0;
 1048|  5.35k|}
jpeg2vips.c:read_jpeg_header:
  571|  5.35k|{
  572|  5.35k|	struct jpeg_decompress_struct *cinfo = &jpeg->cinfo;
  573|       |
  574|  5.35k|	jpeg_saved_marker_ptr p;
  575|  5.35k|	VipsInterpretation interpretation;
  576|  5.35k|	double xres, yres;
  577|       |
  578|       |	/* Capture app2 sections here for assembly.
  579|       |	 */
  580|  5.35k|	void *app2_data[MAX_APP2_SECTIONS] = { 0 };
  581|  5.35k|	size_t app2_data_length[MAX_APP2_SECTIONS] = { 0 };
  582|  5.35k|	size_t data_length;
  583|  5.35k|	int i;
  584|       |
  585|       |	/* Read JPEG header. libjpeg will set out_color_space sanely for us
  586|       |	 * for YUV YCCK etc.
  587|       |	 */
  588|  5.35k|	jpeg_read_header(cinfo, TRUE);
  ------------------
  |  |  209|  5.35k|#define TRUE    1
  ------------------
  589|  5.35k|	cinfo->scale_denom = jpeg->shrink;
  590|  5.35k|	cinfo->scale_num = 1;
  591|  5.35k|	jpeg_calc_output_dimensions(cinfo);
  592|       |
  593|  5.35k|	jpeg->invert_pels = FALSE;
  ------------------
  |  |  206|  5.35k|#define FALSE   0               /* values of boolean */
  ------------------
  594|  5.35k|	switch (cinfo->out_color_space) {
  595|    749|	case JCS_GRAYSCALE:
  ------------------
  |  Branch (595:2): [True: 749, False: 4.60k]
  ------------------
  596|    749|		interpretation = VIPS_INTERPRETATION_B_W;
  597|    749|		break;
  598|       |
  599|  1.02k|	case JCS_CMYK:
  ------------------
  |  Branch (599:2): [True: 1.02k, False: 4.32k]
  ------------------
  600|  1.02k|		interpretation = VIPS_INTERPRETATION_CMYK;
  601|       |
  602|       |		/* CMYKs are almost always returned inverted, but see below.
  603|       |		 */
  604|  1.02k|		jpeg->invert_pels = TRUE;
  ------------------
  |  |  209|  1.02k|#define TRUE    1
  ------------------
  605|  1.02k|		break;
  606|       |
  607|  2.95k|	case JCS_RGB:
  ------------------
  |  Branch (607:2): [True: 2.95k, False: 2.40k]
  ------------------
  608|  3.05k|	default:
  ------------------
  |  Branch (608:2): [True: 108, False: 5.24k]
  ------------------
  609|  3.05k|		interpretation = VIPS_INTERPRETATION_sRGB;
  610|  3.05k|		break;
  611|  5.35k|	}
  612|       |
  613|       |#ifdef DEBUG
  614|       |	if (cinfo->saw_JFIF_marker)
  615|       |		printf("read_jpeg_header: jfif _density %d, %d, unit %d\n",
  616|       |			cinfo->X_density, cinfo->Y_density,
  617|       |			cinfo->density_unit);
  618|       |#endif /*DEBUG*/
  619|       |
  620|       |	/* Get the jfif resolution. exif may overwrite this later. Default to
  621|       |	 * 72dpi (as EXIF does).
  622|       |	 */
  623|  4.83k|	xres = 72.0 / 25.4;
  624|  4.83k|	yres = 72.0 / 25.4;
  625|  4.83k|	if (cinfo->saw_JFIF_marker &&
  ------------------
  |  Branch (625:6): [True: 940, False: 3.89k]
  ------------------
  626|  4.83k|		cinfo->X_density != 1U &&
  ------------------
  |  Branch (626:3): [True: 936, False: 4]
  ------------------
  627|  4.83k|		cinfo->Y_density != 1U) {
  ------------------
  |  Branch (627:3): [True: 932, False: 4]
  ------------------
  628|    932|		switch (cinfo->density_unit) {
  629|     81|		case 0:
  ------------------
  |  Branch (629:3): [True: 81, False: 851]
  ------------------
  630|       |			/* X_density / Y_density gives the pixel aspect ratio.
  631|       |			 * Leave xres, but adjust yres.
  632|       |			 */
  633|     81|			if (cinfo->Y_density > 0)
  ------------------
  |  Branch (633:8): [True: 71, False: 10]
  ------------------
  634|     71|				yres = xres * cinfo->X_density /
  635|     71|					cinfo->Y_density;
  636|     81|			break;
  637|       |
  638|     17|		case 1:
  ------------------
  |  Branch (638:3): [True: 17, False: 915]
  ------------------
  639|       |			/* Pixels per inch.
  640|       |			 */
  641|     17|			xres = cinfo->X_density / 25.4;
  642|     17|			yres = cinfo->Y_density / 25.4;
  643|     17|			vips_image_set_string(out,
  644|     17|				VIPS_META_RESOLUTION_UNIT, "in");
  ------------------
  |  |   93|     17|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  645|     17|			break;
  646|       |
  647|    793|		case 2:
  ------------------
  |  Branch (647:3): [True: 793, False: 139]
  ------------------
  648|       |			/* Pixels per cm.
  649|       |			 */
  650|    793|			xres = cinfo->X_density / 10.0;
  651|    793|			yres = cinfo->Y_density / 10.0;
  652|    793|			vips_image_set_string(out,
  653|    793|				VIPS_META_RESOLUTION_UNIT, "cm");
  ------------------
  |  |   93|    793|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  654|    793|			break;
  655|       |
  656|     41|		default:
  ------------------
  |  Branch (656:3): [True: 41, False: 891]
  ------------------
  657|     41|			g_warning("%s", _("unknown JFIF resolution unit"));
  ------------------
  |  |  338|     41|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|     41|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|     41|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|     41|                               __VA_ARGS__)
  ------------------
  658|     41|			break;
  659|    932|		}
  660|       |
  661|       |#ifdef DEBUG
  662|       |		printf("read_jpeg_header: seen jfif resolution %g, %g p/mm\n",
  663|       |			xres, yres);
  664|       |#endif /*DEBUG*/
  665|    932|	}
  666|       |
  667|       |	/* Set VIPS header.
  668|       |	 */
  669|  4.83k|	vips_image_init_fields(out,
  670|  4.83k|		cinfo->output_width, cinfo->output_height,
  671|  4.83k|		cinfo->output_components,
  672|  4.83k|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  673|  4.83k|		interpretation,
  674|  4.83k|		xres, yres);
  675|       |
  676|  4.83k|	VIPS_SETSTR(out->filename,
  ------------------
  |  |   53|  4.83k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.83k|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|  4.83k|	{ \
  |  |   55|  4.83k|		const char *sst = (V); \
  |  |   56|  4.83k|		\
  |  |   57|  4.83k|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 4.83k, False: 0]
  |  |  ------------------
  |  |   58|  4.83k|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 4.83k]
  |  |  |  Branch (58:16): [True: 4.83k, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|  4.83k|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|  4.83k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|  4.83k|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  4.83k|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|  4.83k|	{ \
  |  |  |  |  |  |   43|  4.83k|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 4.83k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  4.83k|			(void) F((S)); \
  |  |  |  |  |  |   45|  4.83k|			(S) = 0; \
  |  |  |  |  |  |   46|  4.83k|		} \
  |  |  |  |  |  |   47|  4.83k|	} \
  |  |  |  |  |  |   48|  4.83k|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|  4.83k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|  4.83k|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 4.83k]
  |  |  ------------------
  |  |   61|  4.83k|					(S) = g_strdup(sst); \
  |  |   62|  4.83k|			} \
  |  |   63|  4.83k|		} \
  |  |   64|  4.83k|	} \
  |  |   65|  4.83k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.83k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  677|  4.83k|		vips_connection_filename(VIPS_CONNECTION(jpeg->source)));
  678|       |
  679|  4.83k|	if (vips_image_pipelinev(out, VIPS_DEMAND_STYLE_FATSTRIP, NULL))
  ------------------
  |  Branch (679:6): [True: 0, False: 4.83k]
  ------------------
  680|      0|		return -1;
  681|       |
  682|       |	/* cinfo->output_width and cinfo->output_height round up with
  683|       |	 * shrink-on-load. For example, if the image is 1801 pixels across and
  684|       |	 * we shrink by 4, the output will be 450.25 pixels across,
  685|       |	 * cinfo->output_width with be 451, and libjpeg will write a black
  686|       |	 * column of pixels down the right.
  687|       |	 *
  688|       |	 * We must strictly round down, since we don't want fractional pixels
  689|       |	 * along the bottom and right.
  690|       |	 */
  691|  4.83k|	jpeg->output_width = cinfo->image_width / jpeg->shrink;
  692|  4.83k|	jpeg->output_height = cinfo->image_height / jpeg->shrink;
  693|       |
  694|       |	/* Interlaced jpegs need lots of memory to read, so our caller needs
  695|       |	 * to know.
  696|       |	 */
  697|  4.83k|	(void) vips_image_set_int(out, "jpeg-multiscan",
  698|  4.83k|		jpeg_has_multiple_scans(cinfo));
  699|       |
  700|       |	/* 8.7 adds this for PNG as well, so we have a new format-neutral name.
  701|       |	 */
  702|  4.83k|	if (jpeg_has_multiple_scans(cinfo))
  ------------------
  |  Branch (702:6): [True: 4.06k, False: 775]
  ------------------
  703|  4.06k|		vips_image_set_int(out, "interlaced", 1);
  704|       |
  705|  4.83k|	(void) vips_image_set_string(out, "jpeg-chroma-subsample",
  706|  4.83k|		find_chroma_subsample(cinfo));
  707|       |
  708|       |	/* Look for EXIF and ICC profile.
  709|       |	 */
  710|  7.60k|	for (p = cinfo->marker_list; p; p = p->next) {
  ------------------
  |  Branch (710:31): [True: 2.77k, False: 4.83k]
  ------------------
  711|       |#ifdef DEBUG
  712|       |		{
  713|       |			printf("read_jpeg_header: seen %u bytes of APP%d\n",
  714|       |				p->data_length,
  715|       |				p->marker - JPEG_APP0);
  716|       |
  717|       |			for (i = 0; i < 10; i++)
  718|       |				printf("\t%d) '%c' (%d)\n",
  719|       |					i, p->data[i], p->data[i]);
  720|       |		}
  721|       |#endif /*DEBUG*/
  722|       |
  723|  2.77k|		switch (p->marker) {
  724|  1.81k|		case JPEG_APP0 + 1:
  ------------------
  |  | 1168|  1.81k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
  |  Branch (724:3): [True: 1.81k, False: 960]
  ------------------
  725|       |			/* Possible EXIF or XMP data.
  726|       |			 */
  727|  1.81k|			if (p->data_length > 4 &&
  ------------------
  |  Branch (727:8): [True: 1.66k, False: 151]
  ------------------
  728|  1.81k|				vips_isprefix("Exif", (char *) p->data) &&
  ------------------
  |  Branch (728:5): [True: 1.11k, False: 551]
  ------------------
  729|  1.81k|				attach_blob(out, VIPS_META_EXIF_NAME,
  ------------------
  |  |   46|  1.11k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (729:5): [True: 0, False: 1.11k]
  ------------------
  730|  1.11k|					p->data, p->data_length))
  731|      0|				return -1;
  732|       |
  733|  1.81k|			if (p->data_length > 4 &&
  ------------------
  |  Branch (733:8): [True: 1.66k, False: 151]
  ------------------
  734|  1.81k|				vips_isprefix("http", (char *) p->data) &&
  ------------------
  |  Branch (734:5): [True: 469, False: 1.19k]
  ------------------
  735|  1.81k|				attach_xmp_blob(out,
  ------------------
  |  Branch (735:5): [True: 0, False: 469]
  ------------------
  736|    469|					p->data, p->data_length))
  737|      0|				return -1;
  738|       |
  739|  1.81k|			break;
  740|       |
  741|  1.81k|		case JPEG_APP0 + 2:
  ------------------
  |  | 1168|    721|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
  |  Branch (741:3): [True: 721, False: 2.05k]
  ------------------
  742|       |			/* Possible ICC profile.
  743|       |			 */
  744|    721|			if (p->data_length > 14 &&
  ------------------
  |  Branch (744:8): [True: 603, False: 118]
  ------------------
  745|    721|				vips_isprefix("ICC_PROFILE",
  ------------------
  |  Branch (745:5): [True: 265, False: 338]
  ------------------
  746|    603|					(char *) p->data)) {
  747|       |				/* cur_marker numbers from 1, according to
  748|       |				 * spec.
  749|       |				 */
  750|    265|				int cur_marker = p->data[12] - 1;
  751|       |
  752|    265|				if (cur_marker >= 0 &&
  ------------------
  |  Branch (752:9): [True: 176, False: 89]
  ------------------
  753|    265|					cur_marker < MAX_APP2_SECTIONS) {
  ------------------
  |  |  564|    176|#define MAX_APP2_SECTIONS (100)
  ------------------
  |  Branch (753:6): [True: 92, False: 84]
  ------------------
  754|     92|					app2_data[cur_marker] = p->data + 14;
  755|     92|					app2_data_length[cur_marker] =
  756|     92|						p->data_length - 14;
  757|     92|				}
  758|    265|			}
  759|    721|			break;
  760|       |
  761|     90|		case JPEG_APP0 + 13:
  ------------------
  |  | 1168|     90|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
  |  Branch (761:3): [True: 90, False: 2.68k]
  ------------------
  762|       |			/* Possible IPTC data block.
  763|       |			 */
  764|     90|			if (p->data_length > 5 &&
  ------------------
  |  Branch (764:8): [True: 82, False: 8]
  ------------------
  765|     90|				vips_isprefix("Photo", (char *) p->data)) {
  ------------------
  |  Branch (765:5): [True: 16, False: 66]
  ------------------
  766|     16|				if (attach_blob(out, VIPS_META_IPTC_NAME,
  ------------------
  |  |   60|     16|#define VIPS_META_IPTC_NAME "iptc-data"
  ------------------
  |  Branch (766:9): [True: 0, False: 16]
  ------------------
  767|     16|						p->data, p->data_length))
  768|      0|					return -1;
  769|       |
  770|       |				/* Older versions of libvips used this misspelt
  771|       |				 * name :-( attach under this name too for
  772|       |				 * compatibility.
  773|       |				 */
  774|     16|				if (attach_blob(out, "ipct-data",
  ------------------
  |  Branch (774:9): [True: 0, False: 16]
  ------------------
  775|     16|						p->data, p->data_length))
  776|      0|					return -1;
  777|     16|			}
  778|     90|			break;
  779|       |
  780|    149|		case JPEG_APP0 + 14:
  ------------------
  |  | 1168|    149|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
  |  Branch (780:3): [True: 149, False: 2.62k]
  ------------------
  781|       |			/* Adobe block. There's a lot of confusion about
  782|       |			 * whether or not CMYK jpg images are inverted. For
  783|       |			 * the images we have, it seems they should always
  784|       |			 * invert.
  785|       |			 *
  786|       |			 * See: https://sno.phy.queensu.ca/~phil/exiftool/\
  787|       |			 * 	TagNames/JPEG.html#Adobe
  788|       |			 *
  789|       |			 * data[11] == 0 - unknown
  790|       |			 * data[11] == 1 - YCbCr
  791|       |			 * data[11] == 2 - YCCK
  792|       |			 *
  793|       |			 * Leave this code here in case we come up with a
  794|       |			 * better rule.
  795|       |			 */
  796|    149|			if (p->data_length >= 12 &&
  ------------------
  |  Branch (796:8): [True: 123, False: 26]
  ------------------
  797|    149|				vips_isprefix("Adobe", (char *) p->data)) {
  ------------------
  |  Branch (797:5): [True: 67, False: 56]
  ------------------
  798|     67|				if (p->data[11] == 0) {
  ------------------
  |  Branch (798:9): [True: 8, False: 59]
  ------------------
  799|       |#ifdef DEBUG
  800|       |					printf("complete Adobe block, not YCCK image\n");
  801|       |#endif				/*DEBUG*/
  802|       |					// jpeg->invert_pels = FALSE;
  803|      8|				}
  804|     67|			}
  805|    149|			break;
  806|       |
  807|      0|		default:
  ------------------
  |  Branch (807:3): [True: 0, False: 2.77k]
  ------------------
  808|       |#ifdef DEBUG
  809|       |			printf("read_jpeg_header: "
  810|       |				   "ignoring %u byte APP%d block\n",
  811|       |				p->data_length, p->marker - JPEG_APP0);
  812|       |#endif /*DEBUG*/
  813|      0|			break;
  814|  2.77k|		}
  815|  2.77k|	}
  816|       |
  817|       |	/* Assemble ICC sections.
  818|       |	 */
  819|  4.83k|	data_length = 0;
  820|  4.89k|	for (i = 0; i < MAX_APP2_SECTIONS && app2_data[i]; i++)
  ------------------
  |  |  564|  9.79k|#define MAX_APP2_SECTIONS (100)
  ------------------
  |  Branch (820:14): [True: 4.89k, False: 0]
  |  Branch (820:39): [True: 61, False: 4.83k]
  ------------------
  821|     61|		data_length += app2_data_length[i];
  822|  4.83k|	if (data_length) {
  ------------------
  |  Branch (822:6): [True: 61, False: 4.77k]
  ------------------
  823|     61|		unsigned char *data;
  824|     61|		int p;
  825|       |
  826|       |#ifdef DEBUG
  827|       |		printf("read_jpeg_header: assembled %zd byte ICC profile\n",
  828|       |			data_length);
  829|       |#endif /*DEBUG*/
  830|       |
  831|     61|		if (!(data = vips_malloc(NULL, data_length)))
  ------------------
  |  Branch (831:7): [True: 0, False: 61]
  ------------------
  832|      0|			return -1;
  833|       |
  834|     61|		p = 0;
  835|    122|		for (i = 0; i < MAX_APP2_SECTIONS && app2_data[i]; i++) {
  ------------------
  |  |  564|    244|#define MAX_APP2_SECTIONS (100)
  ------------------
  |  Branch (835:15): [True: 122, False: 0]
  |  Branch (835:40): [True: 61, False: 61]
  ------------------
  836|     61|			memcpy(data + p, app2_data[i], app2_data_length[i]);
  837|     61|			p += app2_data_length[i];
  838|     61|		}
  839|       |
  840|     61|		vips_image_set_blob(out, VIPS_META_ICC_NAME,
  ------------------
  |  |   78|     61|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  841|     61|			(VipsCallbackFn) vips_area_free_cb, data, data_length);
  842|     61|	}
  843|       |
  844|  4.83k|	return 0;
  845|  4.83k|}
jpeg2vips.c:find_chroma_subsample:
  495|  4.83k|{
  496|       |	/* libjpeg only uses 4:4:4 and 4:2:0, confusingly.
  497|       |	 *
  498|       |	 * http://poynton.ca/PDFs/Chroma_subsampling_notation.pdf
  499|       |	 */
  500|  4.83k|	gboolean has_subsample = cinfo->max_h_samp_factor > 1 ||
  ------------------
  |  Branch (500:27): [True: 3.62k, False: 1.20k]
  ------------------
  501|  4.83k|		cinfo->max_v_samp_factor > 1;
  ------------------
  |  Branch (501:3): [True: 313, False: 895]
  ------------------
  502|  4.83k|	gboolean is_cmyk = cinfo->num_components > 3;
  503|       |
  504|  4.83k|	return is_cmyk
  ------------------
  |  Branch (504:9): [True: 1.03k, False: 3.79k]
  ------------------
  505|  4.83k|		? (has_subsample ? "4:2:0:4" : "4:4:4:4")
  ------------------
  |  Branch (505:6): [True: 522, False: 516]
  ------------------
  506|  4.83k|		: (has_subsample ? "4:2:0" : "4:4:4");
  ------------------
  |  Branch (506:6): [True: 3.41k, False: 379]
  ------------------
  507|  4.83k|}
jpeg2vips.c:attach_blob:
  511|  1.35k|{
  512|       |	/* Only use the first one.
  513|       |	 */
  514|  1.35k|	if (vips_image_get_typeof(im, field)) {
  ------------------
  |  Branch (514:6): [True: 309, False: 1.04k]
  ------------------
  515|       |#ifdef DEBUG
  516|       |		printf("attach_blob: second %s block, ignoring\n", field);
  517|       |#endif /*DEBUG*/
  518|       |
  519|    309|		return 0;
  520|    309|	}
  521|       |
  522|       |#ifdef DEBUG
  523|       |	printf("attach_blob: attaching %zd bytes of %s\n",
  524|       |		data_length, field);
  525|       |#endif /*DEBUG*/
  526|       |
  527|  1.04k|	vips_image_set_blob_copy(im, field, data, data_length);
  528|       |
  529|  1.04k|	return 0;
  530|  1.35k|}
jpeg2vips.c:attach_xmp_blob:
  538|    469|{
  539|    469|	char *p = (char *) data;
  540|    469|	int i;
  541|       |
  542|    469|	if (data_length < 4 ||
  ------------------
  |  Branch (542:6): [True: 0, False: 469]
  ------------------
  543|    469|		!vips_isprefix("http", p))
  ------------------
  |  Branch (543:3): [True: 0, False: 469]
  ------------------
  544|      0|		return 0;
  545|       |
  546|       |	/* Search for a null char within the first few characters. 80
  547|       |	 * should be plenty for a basic URL.
  548|       |	 *
  549|       |	 * -2 for the extra null.
  550|       |	 */
  551|  3.84k|	for (i = 0; i < VIPS_MIN(80, data_length - 2); i++)
  ------------------
  |  |   55|  3.84k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 3.84k]
  |  |  ------------------
  ------------------
  |  Branch (551:14): [True: 3.56k, False: 285]
  ------------------
  552|  3.56k|		if (!p[i])
  ------------------
  |  Branch (552:7): [True: 184, False: 3.37k]
  ------------------
  553|    184|			break;
  554|    469|	if (p[i])
  ------------------
  |  Branch (554:6): [True: 256, False: 213]
  ------------------
  555|    256|		return 0;
  556|       |
  557|    213|	return attach_blob(im, VIPS_META_XMP_NAME,
  ------------------
  |  |   53|    213|#define VIPS_META_XMP_NAME "xmp-data"
  ------------------
  558|    213|		p + i + 1, data_length - i - 1);
  559|    469|}
jpeg2vips.c:read_jpeg_image:
  941|  2.29k|{
  942|  2.29k|	struct jpeg_decompress_struct *cinfo = &jpeg->cinfo;
  943|  2.29k|	VipsImage **t = (VipsImage **)
  944|  2.29k|		vips_object_local_array(VIPS_OBJECT(out), 5);
  ------------------
  |  |  433|  2.29k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  2.29k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.29k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  945|       |
  946|  2.29k|	VipsImage *im;
  947|       |
  948|       |	/* Here for longjmp() from vips__new_error_exit() during
  949|       |	 * jpeg_read_header() or jpeg_start_decompress().
  950|       |	 */
  951|  2.29k|	if (setjmp(jpeg->eman.jmp))
  952|  1.14k|		return -1;
  953|       |
  954|  1.14k|	t[0] = vips_image_new();
  955|  1.14k|	if (read_jpeg_header(jpeg, t[0]))
  ------------------
  |  Branch (955:6): [True: 0, False: 1.14k]
  ------------------
  956|      0|		return -1;
  957|       |
  958|       |	/* Switch to pixel decode.
  959|       |	 */
  960|  1.14k|	if (vips_source_decode(jpeg->source))
  ------------------
  |  Branch (960:6): [True: 0, False: 1.14k]
  ------------------
  961|      0|		return -1;
  962|       |
  963|  1.14k|	jpeg_start_decompress(cinfo);
  964|       |
  965|       |#ifdef DEBUG
  966|       |	printf("read_jpeg_image: starting decompress\n");
  967|       |#endif /*DEBUG*/
  968|       |
  969|       |	/* We must crop after the seq, or our generate may not be asked for
  970|       |	 * full lines of pixels and will attempt to write beyond the buffer.
  971|       |	 */
  972|  1.14k|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (972:6): [True: 0, False: 1.14k]
  ------------------
  973|  1.14k|			NULL, read_jpeg_generate, NULL,
  974|  1.14k|			jpeg, NULL) ||
  975|  1.14k|		vips_sequential(t[0], &t[1],
  ------------------
  |  Branch (975:3): [True: 0, False: 1.14k]
  ------------------
  976|  1.14k|			"tile_height", 8,
  977|  1.14k|			NULL) ||
  978|  1.14k|		vips_extract_area(t[1], &t[2],
  ------------------
  |  Branch (978:3): [True: 0, False: 1.14k]
  ------------------
  979|  1.14k|			0, 0, jpeg->output_width, jpeg->output_height, NULL))
  980|      0|		return -1;
  981|  1.14k|	im = t[2];
  982|       |
  983|  1.14k|	if (jpeg->autorotate &&
  ------------------
  |  Branch (983:6): [True: 0, False: 1.14k]
  ------------------
  984|  1.14k|		vips_image_get_orientation(im) != 1) {
  ------------------
  |  Branch (984:3): [True: 0, False: 0]
  ------------------
  985|       |		/* We have to copy to memory before calling autorot, since it
  986|       |		 * needs random access.
  987|       |		 */
  988|      0|		if (!(t[3] = vips_image_copy_memory(im)) ||
  ------------------
  |  Branch (988:7): [True: 0, False: 0]
  ------------------
  989|      0|			vips_autorot(t[3], &t[4], NULL))
  ------------------
  |  Branch (989:4): [True: 0, False: 0]
  ------------------
  990|      0|			return -1;
  991|      0|		im = t[4];
  992|      0|	}
  993|       |
  994|  1.14k|	if (vips_image_write(im, out))
  ------------------
  |  Branch (994:6): [True: 260, False: 886]
  ------------------
  995|    260|		return -1;
  996|       |
  997|    886|	return 0;
  998|  1.14k|}
jpeg2vips.c:read_jpeg_generate:
  850|  9.07k|{
  851|  9.07k|	VipsRect *r = &out_region->valid;
  852|  9.07k|	ReadJpeg *jpeg = (ReadJpeg *) a;
  853|  9.07k|	struct jpeg_decompress_struct *cinfo = &jpeg->cinfo;
  854|  9.07k|	int sz = cinfo->output_width * cinfo->output_components;
  855|       |
  856|  9.07k|	int y;
  857|       |
  858|       |#ifdef DEBUG_VERBOSE
  859|       |	printf("read_jpeg_generate: %p line %d, %d rows\n",
  860|       |		g_thread_self(), r->top, r->height);
  861|       |#endif /*DEBUG_VERBOSE*/
  862|       |
  863|  9.07k|	VIPS_GATE_START("read_jpeg_generate: work");
  ------------------
  |  |   41|  9.07k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.07k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  9.07k|	{ \
  |  |   43|  9.07k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 9.07k]
  |  |  ------------------
  |  |   44|  9.07k|			vips__thread_gate_start(NAME); \
  |  |   45|  9.07k|	} \
  |  |   46|  9.07k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.07k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  864|       |
  865|       |	/* We're inside a tilecache where tiles are the full image width, so
  866|       |	 * this should always be true.
  867|       |	 */
  868|  9.07k|	g_assert(r->left == 0);
  ------------------
  |  |  166|  9.07k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  9.07k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.07k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  869|  9.07k|	g_assert(r->width == out_region->im->Xsize);
  ------------------
  |  |  166|  9.07k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  9.07k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.07k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  870|  9.07k|	g_assert(VIPS_RECT_BOTTOM(r) <= out_region->im->Ysize);
  ------------------
  |  |  166|  9.07k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  9.07k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.07k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  871|       |
  872|       |	/* Tiles should always be on a 8-pixel boundary.
  873|       |	 */
  874|  9.07k|	g_assert(r->top % 8 == 0);
  ------------------
  |  |  166|  9.07k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  9.07k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.07k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  875|       |
  876|       |	/* Tiles should always be a strip in height, unless it's the final
  877|       |	 * strip.
  878|       |	 */
  879|  9.07k|	g_assert(r->height == VIPS_MIN(8, out_region->im->Ysize - r->top));
  ------------------
  |  |  166|  9.07k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  9.07k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.07k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  880|       |
  881|       |	/* And check that the y position is correct. It should be, since we are
  882|       |	 * inside a vips_sequential().
  883|       |	 */
  884|  9.07k|	if (r->top != cinfo->output_scanline) {
  ------------------
  |  Branch (884:6): [True: 0, False: 9.07k]
  ------------------
  885|      0|		VIPS_GATE_STOP("read_jpeg_generate: work");
  ------------------
  |  |   49|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|      0|	{ \
  |  |   51|      0|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   52|      0|			vips__thread_gate_stop(NAME); \
  |  |   53|      0|	} \
  |  |   54|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  886|      0|		vips_error("VipsJpeg", _("out of order read at line %d"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  887|      0|			cinfo->output_scanline);
  888|       |
  889|      0|		return -1;
  890|      0|	}
  891|       |
  892|       |	/* Here for longjmp() from vips__new_error_exit() during
  893|       |	 * jpeg_read_scanlines().
  894|       |	 */
  895|  9.07k|	if (setjmp(jpeg->eman.jmp)) {
  896|    260|		VIPS_GATE_STOP("read_jpeg_generate: work");
  ------------------
  |  |   49|    260|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    260|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|    260|	{ \
  |  |   51|    260|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 260]
  |  |  ------------------
  |  |   52|    260|			vips__thread_gate_stop(NAME); \
  |  |   53|    260|	} \
  |  |   54|    260|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    260|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  897|       |
  898|       |#ifdef DEBUG
  899|       |		printf("read_jpeg_generate: longjmp() exit\n");
  900|       |#endif /*DEBUG*/
  901|       |
  902|    260|		return -1;
  903|    260|	}
  904|       |
  905|  8.81k|	if (jpeg->eman.pub.num_warnings > 0 &&
  ------------------
  |  Branch (905:6): [True: 9.01k, False: 18.4E]
  ------------------
  906|  9.01k|		jpeg->fail_on >= VIPS_FAIL_ON_WARNING) {
  ------------------
  |  Branch (906:3): [True: 0, False: 9.01k]
  ------------------
  907|      0|		VIPS_GATE_STOP("read_jpeg_generate: work");
  ------------------
  |  |   49|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|      0|	{ \
  |  |   51|      0|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   52|      0|			vips__thread_gate_stop(NAME); \
  |  |   53|      0|	} \
  |  |   54|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  908|       |
  909|       |		/* Only fail once.
  910|       |		 */
  911|      0|		jpeg->eman.pub.num_warnings = 0;
  912|       |
  913|      0|		return -1;
  914|      0|	}
  915|       |
  916|  76.0k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (916:14): [True: 67.1k, False: 8.81k]
  ------------------
  917|  67.1k|		JSAMPROW row_pointer[1];
  918|       |
  919|  67.1k|		row_pointer[0] = (JSAMPLE *)
  920|  67.1k|			VIPS_REGION_ADDR(out_region, 0, r->top + y);
  ------------------
  |  |  227|  67.1k|	((R)->data + \
  |  |  228|  67.1k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  67.1k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  67.1k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  67.1k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  67.1k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  67.1k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  921|       |
  922|  67.1k|		jpeg_read_scanlines(cinfo, &row_pointer[0], 1);
  923|       |
  924|  67.1k|		if (jpeg->invert_pels) {
  ------------------
  |  Branch (924:7): [True: 24.9k, False: 42.2k]
  ------------------
  925|  24.9k|			int x;
  926|       |
  927|  8.89M|			for (x = 0; x < sz; x++)
  ------------------
  |  Branch (927:16): [True: 8.86M, False: 24.9k]
  ------------------
  928|  8.86M|				row_pointer[0][x] = 255 - row_pointer[0][x];
  929|  24.9k|		}
  930|  67.1k|	}
  931|       |
  932|  8.81k|	VIPS_GATE_STOP("read_jpeg_generate: work");
  ------------------
  |  |   49|  8.81k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.81k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  8.81k|	{ \
  |  |   51|  8.81k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 8.81k]
  |  |  ------------------
  |  |   52|  8.81k|			vips__thread_gate_stop(NAME); \
  |  |   53|  8.81k|	} \
  |  |   54|  8.81k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.81k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  933|       |
  934|  8.81k|	return 0;
  935|  8.81k|}

jpegload.c:vips_foreign_load_jpeg_class_init:
  166|      1|{
  167|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  169|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  170|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  171|       |
  172|      1|	gobject_class->dispose = vips_foreign_load_jpeg_dispose;
  173|      1|	gobject_class->set_property = vips_object_set_property;
  174|      1|	gobject_class->get_property = vips_object_get_property;
  175|       |
  176|      1|	object_class->nickname = "jpegload_base";
  177|      1|	object_class->description = _("load jpeg");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  178|      1|	object_class->build = vips_foreign_load_jpeg_build;
  179|       |
  180|       |	/* We are fast at is_a(), so high priority.
  181|       |	 */
  182|      1|	foreign_class->priority = 50;
  183|       |
  184|      1|	load_class->get_flags_filename =
  185|      1|		vips_foreign_load_jpeg_get_flags_filename;
  186|      1|	load_class->get_flags = vips_foreign_load_jpeg_get_flags;
  187|      1|	load_class->header = vips_foreign_load_jpeg_header;
  188|      1|	load_class->load = vips_foreign_load_jpeg_load;
  189|       |
  190|      1|	VIPS_ARG_INT(class, "shrink", 20,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  191|      1|		_("Shrink"),
  192|      1|		_("Shrink factor on load"),
  193|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  194|      1|		G_STRUCT_OFFSET(VipsForeignLoadJpeg, shrink),
  195|      1|		1, 8, 1);
  196|       |
  197|      1|	VIPS_ARG_BOOL(class, "autorotate", 21,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  198|      1|		_("Autorotate"),
  199|      1|		_("Rotate image using exif orientation"),
  200|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  201|      1|		G_STRUCT_OFFSET(VipsForeignLoadJpeg, autorotate),
  202|      1|		FALSE);
  203|       |
  204|       |#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
  205|       |	VIPS_ARG_BOOL(class, "unlimited", 22,
  206|       |		_("Unlimited"),
  207|       |		_("Remove all denial of service limits"),
  208|       |		VIPS_ARGUMENT_OPTIONAL_INPUT,
  209|       |		G_STRUCT_OFFSET(VipsForeignLoadJpeg, unlimited),
  210|       |		FALSE);
  211|       |#endif
  212|      1|}
jpegload.c:vips_foreign_load_jpeg_dispose:
   98|  3.06k|{
   99|  3.06k|	VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) gobject;
  100|       |
  101|  3.06k|	VIPS_UNREF(jpeg->source);
  ------------------
  |  |   57|  3.06k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  3.06k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  3.06k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  3.06k|	{ \
  |  |  |  |   43|  3.06k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 3.06k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  3.06k|			(void) F((S)); \
  |  |  |  |   45|  3.06k|			(S) = 0; \
  |  |  |  |   46|  3.06k|		} \
  |  |  |  |   47|  3.06k|	} \
  |  |  |  |   48|  3.06k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  3.06k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  102|       |
  103|  3.06k|	G_OBJECT_CLASS(vips_foreign_load_jpeg_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  3.06k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  3.06k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  3.06k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  104|  3.06k|}
jpegload.c:vips_foreign_load_jpeg_build:
  108|  3.06k|{
  109|  3.06k|	VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) object;
  110|       |
  111|  3.06k|	if (jpeg->shrink != 1 &&
  ------------------
  |  Branch (111:6): [True: 0, False: 3.06k]
  ------------------
  112|  3.06k|		jpeg->shrink != 2 &&
  ------------------
  |  Branch (112:3): [True: 0, False: 0]
  ------------------
  113|  3.06k|		jpeg->shrink != 4 &&
  ------------------
  |  Branch (113:3): [True: 0, False: 0]
  ------------------
  114|  3.06k|		jpeg->shrink != 8) {
  ------------------
  |  Branch (114:3): [True: 0, False: 0]
  ------------------
  115|      0|		vips_error("VipsFormatLoadJpeg",
  116|      0|			_("bad shrink factor %d"), jpeg->shrink);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  117|      0|		return -1;
  118|      0|	}
  119|       |
  120|  3.06k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_jpeg_parent_class)->build(object))
  ------------------
  |  |  435|  3.06k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  3.06k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  3.06k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (120:6): [True: 518, False: 2.54k]
  ------------------
  121|    518|		return -1;
  122|       |
  123|  2.54k|	return 0;
  124|  3.06k|}
jpegload.c:vips_foreign_load_jpeg_get_flags:
  128|  3.06k|{
  129|  3.06k|	return VIPS_FOREIGN_SEQUENTIAL;
  130|  3.06k|}
jpegload.c:vips_foreign_load_jpeg_header:
  140|  3.06k|{
  141|  3.06k|	VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) load;
  142|       |
  143|  3.06k|	if (vips__jpeg_read_source(jpeg->source,
  ------------------
  |  Branch (143:6): [True: 518, False: 2.54k]
  ------------------
  144|  3.06k|			load->out, TRUE, jpeg->shrink, load->fail_on,
  ------------------
  |  |  798|  3.06k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  3.06k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  145|  3.06k|			jpeg->autorotate, jpeg->unlimited))
  146|    518|		return -1;
  147|       |
  148|  2.54k|	return 0;
  149|  3.06k|}
jpegload.c:vips_foreign_load_jpeg_load:
  153|  2.29k|{
  154|  2.29k|	VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) load;
  155|       |
  156|  2.29k|	if (vips__jpeg_read_source(jpeg->source,
  ------------------
  |  Branch (156:6): [True: 1.40k, False: 886]
  ------------------
  157|  2.29k|			load->real, FALSE, jpeg->shrink, load->fail_on,
  ------------------
  |  |  794|  2.29k|#define	FALSE	(0)
  ------------------
  158|  2.29k|			jpeg->autorotate, jpeg->unlimited))
  159|  1.40k|		return -1;
  160|       |
  161|    886|	return 0;
  162|  2.29k|}
jpegload.c:vips_foreign_load_jpeg_init:
  216|  3.06k|{
  217|  3.06k|	jpeg->shrink = 1;
  218|  3.06k|}
jpegload.c:vips_foreign_load_jpeg_source_class_init:
  260|      1|{
  261|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  262|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  263|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  264|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  265|       |
  266|      1|	gobject_class->set_property = vips_object_set_property;
  267|      1|	gobject_class->get_property = vips_object_get_property;
  268|       |
  269|      1|	object_class->nickname = "jpegload_source";
  270|      1|	object_class->description = _("load image from jpeg source");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  271|      1|	object_class->build = vips_foreign_load_jpeg_source_build;
  272|       |
  273|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  274|       |
  275|      1|	load_class->is_a_source = vips_foreign_load_jpeg_source_is_a_source;
  276|       |
  277|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  278|      1|		_("Source"),
  279|      1|		_("Source to load from"),
  280|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  281|      1|		G_STRUCT_OFFSET(VipsForeignLoadJpegSource, source),
  282|      1|		VIPS_TYPE_SOURCE);
  283|      1|}
jpegload.c:vips_foreign_load_jpeg_source_is_a_source:
  253|  14.2k|{
  254|  14.2k|	return vips__isjpeg_source(source);
  255|  14.2k|}
jpegload.c:vips_foreign_load_jpeg_file_class_init:
  336|      1|{
  337|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  338|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  339|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  340|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  341|       |
  342|      1|	gobject_class->set_property = vips_object_set_property;
  343|      1|	gobject_class->get_property = vips_object_get_property;
  344|       |
  345|      1|	object_class->nickname = "jpegload";
  346|      1|	object_class->description = _("load jpeg from file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  347|      1|	object_class->build = vips_foreign_load_jpeg_file_build;
  348|       |
  349|      1|	foreign_class->suffs = vips__jpeg_suffs;
  350|       |
  351|      1|	load_class->is_a = vips_foreign_load_jpeg_file_is_a;
  352|       |
  353|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  354|      1|		_("Filename"),
  355|      1|		_("Filename to load from"),
  356|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  357|      1|		G_STRUCT_OFFSET(VipsForeignLoadJpegFile, filename),
  358|      1|		NULL);
  359|      1|}
jpegload.c:vips_foreign_load_jpeg_buffer_class_init:
  415|      1|{
  416|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  417|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  418|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  419|       |
  420|      1|	gobject_class->set_property = vips_object_set_property;
  421|      1|	gobject_class->get_property = vips_object_get_property;
  422|       |
  423|      1|	object_class->nickname = "jpegload_buffer";
  424|      1|	object_class->description = _("load jpeg from buffer");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  425|      1|	object_class->build = vips_foreign_load_jpeg_buffer_build;
  426|       |
  427|      1|	load_class->is_a_buffer = vips_foreign_load_jpeg_buffer_is_a_buffer;
  428|       |
  429|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  430|      1|		_("Buffer"),
  431|      1|		_("Buffer to load from"),
  432|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  433|      1|		G_STRUCT_OFFSET(VipsForeignLoadJpegBuffer, blob),
  434|      1|		VIPS_TYPE_BLOB);
  435|      1|}
jpegload.c:vips_foreign_load_jpeg_buffer_build:
  380|  3.06k|{
  381|  3.06k|	VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) object;
  382|  3.06k|	VipsForeignLoadJpegBuffer *buffer =
  383|  3.06k|		(VipsForeignLoadJpegBuffer *) object;
  384|       |
  385|  3.06k|	if (buffer->blob &&
  ------------------
  |  Branch (385:6): [True: 3.06k, False: 0]
  ------------------
  386|  3.06k|		!(jpeg->source = vips_source_new_from_memory(
  ------------------
  |  Branch (386:3): [True: 0, False: 3.06k]
  ------------------
  387|  3.06k|			  VIPS_AREA(buffer->blob)->data,
  ------------------
  |  |  137|  3.06k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  388|  3.06k|			  VIPS_AREA(buffer->blob)->length)))
  ------------------
  |  |  137|  3.06k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  389|      0|		return -1;
  390|       |
  391|  3.06k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_jpeg_buffer_parent_class)
  ------------------
  |  |  435|  3.06k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  3.06k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  3.06k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (391:6): [True: 518, False: 2.54k]
  ------------------
  392|  3.06k|			->build(object))
  393|    518|		return -1;
  394|       |
  395|  2.54k|	return 0;
  396|  3.06k|}
jpegload.c:vips_foreign_load_jpeg_buffer_is_a_buffer:
  400|  14.2k|{
  401|  14.2k|	VipsSource *source;
  402|  14.2k|	gboolean result;
  403|       |
  404|  14.2k|	if (!(source = vips_source_new_from_memory(buf, len)))
  ------------------
  |  Branch (404:6): [True: 0, False: 14.2k]
  ------------------
  405|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  406|  14.2k|	result = vips_foreign_load_jpeg_source_is_a_source(source);
  407|  14.2k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  14.2k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  14.2k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  14.2k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  14.2k|	{ \
  |  |  |  |   43|  14.2k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 14.2k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  14.2k|			(void) F((S)); \
  |  |  |  |   45|  14.2k|			(S) = 0; \
  |  |  |  |   46|  14.2k|		} \
  |  |  |  |   47|  14.2k|	} \
  |  |  |  |   48|  14.2k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  14.2k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  408|       |
  409|  14.2k|	return result;
  410|  14.2k|}
jpegload.c:vips_foreign_load_jpeg_buffer_init:
  439|  3.06k|{
  440|  3.06k|}

jpegsave.c:vips_foreign_save_jpeg_class_init:
  143|      1|{
  144|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  145|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  146|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  147|      1|	VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
  148|       |
  149|      1|	gobject_class->set_property = vips_object_set_property;
  150|      1|	gobject_class->get_property = vips_object_get_property;
  151|       |
  152|      1|	object_class->nickname = "jpegsave_base";
  153|      1|	object_class->description = _("save jpeg");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  154|      1|	object_class->build = vips_foreign_save_jpeg_build;
  155|       |
  156|      1|	foreign_class->suffs = vips__jpeg_suffs;
  157|       |
  158|       |	/* See also vips_foreign_save_tiff_build() when saving JPEG in TIFF.
  159|       |	 */
  160|      1|	save_class->saveable = VIPS_SAVEABLE_RGB_CMYK;
  161|      1|	save_class->format_table = bandfmt_jpeg;
  162|       |
  163|      1|	VIPS_ARG_INT(class, "Q", 10,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  164|      1|		_("Q"),
  165|      1|		_("Q factor"),
  166|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  167|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpeg, Q),
  168|      1|		1, 100, 75);
  169|       |
  170|      1|	VIPS_ARG_BOOL(class, "optimize_coding", 12,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  171|      1|		_("Optimize coding"),
  172|      1|		_("Compute optimal Huffman coding tables"),
  173|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  174|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpeg, optimize_coding),
  175|      1|		FALSE);
  176|       |
  177|      1|	VIPS_ARG_BOOL(class, "interlace", 13,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  178|      1|		_("Interlace"),
  179|      1|		_("Generate an interlaced (progressive) jpeg"),
  180|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  181|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpeg, interlace),
  182|      1|		FALSE);
  183|       |
  184|      1|	VIPS_ARG_BOOL(class, "no_subsample", 14,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  185|      1|		_("No subsample"),
  186|      1|		_("Disable chroma subsample"),
  187|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  188|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpeg, no_subsample),
  189|      1|		FALSE);
  190|       |
  191|      1|	VIPS_ARG_BOOL(class, "trellis_quant", 15,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  192|      1|		_("Trellis quantisation"),
  193|      1|		_("Apply trellis quantisation to each 8x8 block"),
  194|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  195|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpeg, trellis_quant),
  196|      1|		FALSE);
  197|       |
  198|      1|	VIPS_ARG_BOOL(class, "overshoot_deringing", 16,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  199|      1|		_("Overshoot de-ringing"),
  200|      1|		_("Apply overshooting to samples with extreme values"),
  201|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  202|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpeg, overshoot_deringing),
  203|      1|		FALSE);
  204|       |
  205|      1|	VIPS_ARG_BOOL(class, "optimize_scans", 17,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  206|      1|		_("Optimize scans"),
  207|      1|		_("Split spectrum of DCT coefficients into separate scans"),
  208|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  209|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpeg, optimize_scans),
  210|      1|		FALSE);
  211|       |
  212|      1|	VIPS_ARG_INT(class, "quant_table", 18,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  213|      1|		_("Quantization table"),
  214|      1|		_("Use predefined quantization table with given index"),
  215|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  216|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpeg, quant_table),
  217|      1|		0, 8, 0);
  218|       |
  219|      1|	VIPS_ARG_ENUM(class, "subsample_mode", 19,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  220|      1|		_("Subsample mode"),
  221|      1|		_("Select chroma subsample operation mode"),
  222|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  223|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpeg, subsample_mode),
  224|      1|		VIPS_TYPE_FOREIGN_SUBSAMPLE,
  225|      1|		VIPS_FOREIGN_SUBSAMPLE_AUTO);
  226|       |
  227|      1|	VIPS_ARG_INT(class, "restart_interval", 20,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  228|      1|		_("Restart interval"),
  229|      1|		_("Add restart markers every specified number of mcu"),
  230|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  231|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpeg, restart_interval),
  232|      1|		0, INT_MAX, 0);
  233|      1|}
jpegsave.c:vips_foreign_save_jpeg_target_class_init:
  280|      1|{
  281|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  282|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  283|       |
  284|      1|	gobject_class->set_property = vips_object_set_property;
  285|      1|	gobject_class->get_property = vips_object_get_property;
  286|       |
  287|      1|	object_class->nickname = "jpegsave_target";
  288|      1|	object_class->description = _("save image to jpeg target");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  289|      1|	object_class->build = vips_foreign_save_jpeg_target_build;
  290|       |
  291|      1|	VIPS_ARG_OBJECT(class, "target", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  292|      1|		_("Target"),
  293|      1|		_("Target to save to"),
  294|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  295|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpegTarget, target),
  296|      1|		VIPS_TYPE_TARGET);
  297|      1|}
jpegsave.c:vips_foreign_save_jpeg_file_class_init:
  349|      1|{
  350|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  351|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  352|       |
  353|      1|	gobject_class->set_property = vips_object_set_property;
  354|      1|	gobject_class->get_property = vips_object_get_property;
  355|       |
  356|      1|	object_class->nickname = "jpegsave";
  357|      1|	object_class->description = _("save image to jpeg file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  358|      1|	object_class->build = vips_foreign_save_jpeg_file_build;
  359|       |
  360|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  361|      1|		_("Filename"),
  362|      1|		_("Filename to save to"),
  363|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  364|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpegFile, filename),
  365|      1|		NULL);
  366|      1|}
jpegsave.c:vips_foreign_save_jpeg_buffer_class_init:
  427|      1|{
  428|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  429|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  430|       |
  431|      1|	gobject_class->set_property = vips_object_set_property;
  432|      1|	gobject_class->get_property = vips_object_get_property;
  433|       |
  434|      1|	object_class->nickname = "jpegsave_buffer";
  435|      1|	object_class->description = _("save image to jpeg buffer");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  436|      1|	object_class->build = vips_foreign_save_jpeg_buffer_build;
  437|       |
  438|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  439|      1|		_("Buffer"),
  440|      1|		_("Buffer to save to"),
  441|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  442|      1|		G_STRUCT_OFFSET(VipsForeignSaveJpegBuffer, buf),
  443|      1|		VIPS_TYPE_BLOB);
  444|      1|}
jpegsave.c:vips_foreign_save_jpeg_mime_class_init:
  507|      1|{
  508|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  509|       |
  510|      1|	object_class->nickname = "jpegsave_mime";
  511|      1|	object_class->description = _("save image to jpeg mime");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  512|      1|	object_class->build = vips_foreign_save_jpeg_mime_build;
  513|      1|}

nsgif_destroy:
 1384|    300|{
 1385|    300|	if (gif == NULL) {
  ------------------
  |  Branch (1385:6): [True: 0, False: 300]
  ------------------
 1386|      0|		return;
 1387|      0|	}
 1388|       |
 1389|       |	/* Release all our memory blocks */
 1390|    300|	if (gif->frame_image) {
  ------------------
  |  Branch (1390:6): [True: 173, False: 127]
  ------------------
 1391|    173|		assert(gif->bitmap.destroy);
 1392|    173|		gif->bitmap.destroy(gif->frame_image);
 1393|    173|		gif->frame_image = NULL;
 1394|    173|	}
 1395|       |
 1396|    300|	free(gif->frames);
 1397|    300|	gif->frames = NULL;
 1398|       |
 1399|    300|	free(gif->prev_frame);
 1400|    300|	gif->prev_frame = NULL;
 1401|       |
 1402|    300|	lzw_context_destroy(gif->lzw_ctx);
 1403|    300|	gif->lzw_ctx = NULL;
 1404|       |
 1405|    300|	free(gif);
 1406|    300|}
nsgif_create:
 1492|    300|{
 1493|    300|	nsgif_t *gif;
 1494|       |
 1495|    300|	gif = calloc(1, sizeof(*gif));
 1496|    300|	if (gif == NULL) {
  ------------------
  |  Branch (1496:6): [True: 0, False: 300]
  ------------------
 1497|      0|		return NSGIF_ERR_OOM;
 1498|      0|	}
 1499|       |
 1500|    300|	gif->bitmap = *bitmap_vt;
 1501|    300|	gif->decoded_frame = NSGIF_FRAME_INVALID;
  ------------------
  |  |  156|    300|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
 1502|    300|	gif->prev_index = NSGIF_FRAME_INVALID;
  ------------------
  |  |  156|    300|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
 1503|       |
 1504|    300|	gif->delay_min = NSGIF_FRAME_DELAY_MIN;
  ------------------
  |  |   21|    300|#define NSGIF_FRAME_DELAY_MIN 2
  ------------------
 1505|    300|	gif->delay_default = NSGIF_FRAME_DELAY_DEFAULT;
  ------------------
  |  |   28|    300|#define NSGIF_FRAME_DELAY_DEFAULT 10
  ------------------
 1506|       |
 1507|    300|	gif->colour_layout = nsgif__bitmap_fmt_to_colour_layout(bitmap_fmt);
 1508|       |
 1509|    300|	*gif_out = gif;
 1510|    300|	return NSGIF_OK;
 1511|    300|}
nsgif_data_scan:
 1612|    300|{
 1613|    300|	const uint8_t *nsgif_data;
 1614|    300|	nsgif_error ret;
 1615|    300|	uint32_t frames;
 1616|       |
 1617|    300|	if (gif->data_complete) {
  ------------------
  |  Branch (1617:6): [True: 0, False: 300]
  ------------------
 1618|      0|		return NSGIF_ERR_DATA_COMPLETE;
 1619|      0|	}
 1620|       |
 1621|       |	/* Initialize values */
 1622|    300|	gif->buf_len = size;
 1623|    300|	gif->buf = data;
 1624|       |
 1625|       |	/* Get our current processing position */
 1626|    300|	nsgif_data = gif->buf + gif->buf_pos;
 1627|       |
 1628|       |	/* See if we should initialise the GIF */
 1629|    300|	if (gif->buf_pos == 0) {
  ------------------
  |  Branch (1629:6): [True: 300, False: 0]
  ------------------
 1630|       |		/* We want everything to be NULL before we start so we've no
 1631|       |		 * chance of freeing bad pointers (paranoia)
 1632|       |		 */
 1633|    300|		gif->frame_image = NULL;
 1634|    300|		gif->frames = NULL;
 1635|    300|		gif->frame_holders = 0;
 1636|       |
 1637|       |		/* The caller may have been lazy and not reset any values */
 1638|    300|		gif->info.frame_count = 0;
 1639|    300|		gif->frame_count_partial = 0;
 1640|    300|		gif->decoded_frame = NSGIF_FRAME_INVALID;
  ------------------
  |  |  156|    300|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
 1641|    300|		gif->frame = NSGIF_FRAME_INVALID;
  ------------------
  |  |  156|    300|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
 1642|       |
 1643|    300|		ret = nsgif__parse_header(gif, &nsgif_data, false);
 1644|    300|		if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1644:7): [True: 1, False: 299]
  ------------------
 1645|      1|			return ret;
 1646|      1|		}
 1647|       |
 1648|    299|		ret = nsgif__parse_logical_screen_descriptor(gif, &nsgif_data);
 1649|    299|		if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1649:7): [True: 6, False: 293]
  ------------------
 1650|      6|			return ret;
 1651|      6|		}
 1652|       |
 1653|       |		/* Remember we've done this now */
 1654|    293|		gif->buf_pos = nsgif_data - gif->buf;
 1655|       |
 1656|       |		/* Some broken GIFs report the size as the screen size they
 1657|       |		 * were created in. As such, we detect for the common cases and
 1658|       |		 * set the sizes as 0 if they are found which results in the
 1659|       |		 * GIF being the maximum size of the frames.
 1660|       |		 */
 1661|    293|		if (((gif->info.width == 640) && (gif->info.height == 480)) ||
  ------------------
  |  Branch (1661:8): [True: 0, False: 293]
  |  Branch (1661:36): [True: 0, False: 0]
  ------------------
 1662|    293|		    ((gif->info.width == 640) && (gif->info.height == 512)) ||
  ------------------
  |  Branch (1662:8): [True: 0, False: 293]
  |  Branch (1662:36): [True: 0, False: 0]
  ------------------
 1663|    293|		    ((gif->info.width == 800) && (gif->info.height == 600)) ||
  ------------------
  |  Branch (1663:8): [True: 2, False: 291]
  |  Branch (1663:36): [True: 0, False: 2]
  ------------------
 1664|    293|		    ((gif->info.width == 1024) && (gif->info.height == 768)) ||
  ------------------
  |  Branch (1664:8): [True: 2, False: 291]
  |  Branch (1664:37): [True: 0, False: 2]
  ------------------
 1665|    293|		    ((gif->info.width == 1280) && (gif->info.height == 1024)) ||
  ------------------
  |  Branch (1665:8): [True: 1, False: 292]
  |  Branch (1665:37): [True: 0, False: 1]
  ------------------
 1666|    293|		    ((gif->info.width == 1600) && (gif->info.height == 1200)) ||
  ------------------
  |  Branch (1666:8): [True: 0, False: 293]
  |  Branch (1666:37): [True: 0, False: 0]
  ------------------
 1667|    293|		    ((gif->info.width == 0) || (gif->info.height == 0)) ||
  ------------------
  |  Branch (1667:8): [True: 1, False: 292]
  |  Branch (1667:34): [True: 13, False: 279]
  ------------------
 1668|    293|		    ((gif->info.width > 2048) || (gif->info.height > 2048))) {
  ------------------
  |  Branch (1668:8): [True: 52, False: 227]
  |  Branch (1668:36): [True: 23, False: 204]
  ------------------
 1669|     89|			gif->info.width = 1;
 1670|     89|			gif->info.height = 1;
 1671|     89|		}
 1672|       |
 1673|       |		/* Set the first colour to a value that will never occur in
 1674|       |		 * reality so we know if we've processed it
 1675|       |		*/
 1676|    293|		gif->global_colour_table[0] = NSGIF_PROCESS_COLOURS;
  ------------------
  |  |  153|    293|#define NSGIF_PROCESS_COLOURS 0xaa000000
  ------------------
 1677|       |
 1678|       |		/* Check if the GIF has no frame data (13-byte header + 1-byte
 1679|       |		 * termination block) Although generally useless, the GIF
 1680|       |		 * specification does not expressly prohibit this
 1681|       |		 */
 1682|    293|		if (gif->buf_len == gif->buf_pos + 1) {
  ------------------
  |  Branch (1682:7): [True: 3, False: 290]
  ------------------
 1683|      3|			if (nsgif_data[0] == NSGIF_TRAILER) {
  ------------------
  |  |  168|      3|#define NSGIF_TRAILER 0x3b
  ------------------
  |  Branch (1683:8): [True: 1, False: 2]
  ------------------
 1684|      1|				return NSGIF_OK;
 1685|      1|			}
 1686|      3|		}
 1687|    293|	}
 1688|       |
 1689|       |	/*  Do the colour map if we haven't already. As the top byte is always
 1690|       |	 *  0xff or 0x00 depending on the transparency we know if it's been
 1691|       |	 *  filled in.
 1692|       |	 */
 1693|    292|	if (gif->global_colour_table[0] == NSGIF_PROCESS_COLOURS) {
  ------------------
  |  |  153|    292|#define NSGIF_PROCESS_COLOURS 0xaa000000
  ------------------
  |  Branch (1693:6): [True: 292, False: 0]
  ------------------
 1694|       |		/* Check for a global colour map signified by bit 7 */
 1695|    292|		if (gif->info.global_palette) {
  ------------------
  |  Branch (1695:7): [True: 201, False: 91]
  ------------------
 1696|    201|			size_t remaining = gif->buf + gif->buf_len - nsgif_data;
 1697|    201|			size_t used;
 1698|       |
 1699|    201|			ret = nsgif__colour_table_extract(
 1700|    201|					gif->global_colour_table,
 1701|    201|					&gif->colour_layout,
 1702|    201|					gif->colour_table_size,
 1703|    201|					nsgif_data, remaining, &used, true);
 1704|    201|			if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1704:8): [True: 4, False: 197]
  ------------------
 1705|      4|				return ret;
 1706|      4|			}
 1707|       |
 1708|    197|			nsgif_data += used;
 1709|    197|			gif->buf_pos = (nsgif_data - gif->buf);
 1710|    197|		} else {
 1711|       |			/* Create a default colour table with the first two
 1712|       |			 * colours as black and white. */
 1713|     91|			uint8_t *entry = (uint8_t *)gif->global_colour_table;
 1714|       |
 1715|       |			/* Black */
 1716|     91|			entry[gif->colour_layout.r] = 0x00;
 1717|     91|			entry[gif->colour_layout.g] = 0x00;
 1718|     91|			entry[gif->colour_layout.b] = 0x00;
 1719|     91|			entry[gif->colour_layout.a] = 0xFF;
 1720|       |
 1721|     91|			entry += sizeof(uint32_t);
 1722|       |
 1723|       |			/* White */
 1724|     91|			entry[gif->colour_layout.r] = 0xFF;
 1725|     91|			entry[gif->colour_layout.g] = 0xFF;
 1726|     91|			entry[gif->colour_layout.b] = 0xFF;
 1727|     91|			entry[gif->colour_layout.a] = 0xFF;
 1728|       |
 1729|     91|			gif->colour_table_size = 2;
 1730|     91|		}
 1731|       |
 1732|    288|		if (gif->info.global_palette &&
  ------------------
  |  Branch (1732:7): [True: 197, False: 91]
  ------------------
 1733|    288|		    gif->bg_index < gif->colour_table_size) {
  ------------------
  |  Branch (1733:7): [True: 181, False: 16]
  ------------------
 1734|    181|			size_t bg_idx = gif->bg_index;
 1735|    181|			gif->info.background = gif->global_colour_table[bg_idx];
 1736|    181|		} else {
 1737|    107|			gif->info.background = gif->global_colour_table[0];
 1738|    107|		}
 1739|    288|	}
 1740|       |
 1741|    288|	if (gif->lzw_ctx == NULL) {
  ------------------
  |  Branch (1741:6): [True: 288, False: 0]
  ------------------
 1742|    288|		lzw_result res = lzw_context_create(
 1743|    288|				(struct lzw_ctx **)&gif->lzw_ctx);
 1744|    288|		if (res != LZW_OK) {
  ------------------
  |  Branch (1744:7): [True: 0, False: 288]
  ------------------
 1745|      0|			return nsgif__error_from_lzw(res);
 1746|      0|		}
 1747|    288|	}
 1748|       |
 1749|       |	/* Try to initialise all frames. */
 1750|    454|	do {
 1751|    454|		frames = gif->info.frame_count;
 1752|    454|		ret = nsgif__process_frame(gif, frames, false);
 1753|    454|	} while (gif->info.frame_count > frames);
  ------------------
  |  Branch (1753:11): [True: 166, False: 288]
  ------------------
 1754|       |
 1755|    288|	if (ret == NSGIF_ERR_END_OF_DATA && gif->info.frame_count > 0) {
  ------------------
  |  Branch (1755:6): [True: 201, False: 87]
  |  Branch (1755:38): [True: 37, False: 164]
  ------------------
 1756|     37|		ret = NSGIF_OK;
 1757|     37|	}
 1758|       |
 1759|    288|	return ret;
 1760|    288|}
nsgif_data_complete:
 1765|    300|{
 1766|    300|	if (gif->data_complete == false) {
  ------------------
  |  Branch (1766:6): [True: 300, False: 0]
  ------------------
 1767|    300|		uint32_t start = gif->info.frame_count;
 1768|    300|		uint32_t end = gif->frame_count_partial;
 1769|       |
 1770|    315|		for (uint32_t f = start; f < end; f++) {
  ------------------
  |  Branch (1770:28): [True: 124, False: 191]
  ------------------
 1771|    124|			nsgif_frame *frame = &gif->frames[f];
 1772|       |
 1773|    124|			if (frame->lzw_data_length > 0) {
  ------------------
  |  Branch (1773:8): [True: 109, False: 15]
  ------------------
 1774|    109|				frame->info.display = true;
 1775|    109|				gif->info.frame_count = f + 1;
 1776|       |
 1777|    109|				if (f == 0) {
  ------------------
  |  Branch (1777:9): [True: 97, False: 12]
  ------------------
 1778|     97|					frame->info.transparency = true;
 1779|     97|				}
 1780|    109|				break;
 1781|    109|			}
 1782|    124|		}
 1783|    300|	}
 1784|       |
 1785|    300|	gif->data_complete = true;
 1786|    300|}
nsgif_frame_decode:
 1951|    173|{
 1952|    173|	uint32_t start_frame;
 1953|    173|	nsgif_error ret = NSGIF_OK;
 1954|       |
 1955|    173|	if (frame >= gif->info.frame_count) {
  ------------------
  |  Branch (1955:6): [True: 0, False: 173]
  ------------------
 1956|      0|		return NSGIF_ERR_BAD_FRAME;
 1957|      0|	}
 1958|       |
 1959|    173|	if (gif->decoded_frame == frame) {
  ------------------
  |  Branch (1959:6): [True: 0, False: 173]
  ------------------
 1960|      0|		*bitmap = gif->frame_image;
 1961|      0|		return NSGIF_OK;
 1962|       |
 1963|    173|	} else if (gif->decoded_frame >= frame ||
  ------------------
  |  Branch (1963:13): [True: 173, False: 0]
  ------------------
 1964|    173|	           gif->decoded_frame == NSGIF_FRAME_INVALID) {
  ------------------
  |  |  156|      0|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
  |  Branch (1964:13): [True: 0, False: 0]
  ------------------
 1965|       |		/* Can skip to first frame or restart. */
 1966|    173|		start_frame = 0;
 1967|    173|	} else {
 1968|      0|		start_frame = nsgif__frame_next(
 1969|      0|				gif, false, gif->decoded_frame);
 1970|      0|	}
 1971|       |
 1972|    293|	for (uint32_t f = start_frame; f <= frame; f++) {
  ------------------
  |  Branch (1972:33): [True: 173, False: 120]
  ------------------
 1973|    173|		ret = nsgif__process_frame(gif, f, true);
 1974|    173|		if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1974:7): [True: 53, False: 120]
  ------------------
 1975|     53|			return ret;
 1976|     53|		}
 1977|    173|	}
 1978|       |
 1979|    120|	*bitmap = gif->frame_image;
 1980|    120|	return ret;
 1981|    173|}
nsgif_get_info:
 1985|    300|{
 1986|    300|	return &gif->info;
 1987|    300|}
nsgif_get_frame_info:
 1993|    550|{
 1994|    550|	if (frame >= gif->info.frame_count) {
  ------------------
  |  Branch (1994:6): [True: 0, False: 550]
  ------------------
 1995|      0|		return NULL;
 1996|      0|	}
 1997|       |
 1998|    550|	return &gif->frames[frame].info;
 1999|    550|}
nsgif_global_palette:
 2006|    360|{
 2007|    360|	size_t len = sizeof(*table) * NSGIF_MAX_COLOURS;
  ------------------
  |  |   27|    360|#define NSGIF_MAX_COLOURS 256
  ------------------
 2008|       |
 2009|    360|	memcpy(table, gif->global_colour_table, len);
 2010|    360|	*entries = gif->colour_table_size;
 2011|    360|}
nsgif_local_palette:
 2019|     99|{
 2020|     99|	const nsgif_frame *f;
 2021|       |
 2022|     99|	if (frame >= gif->frame_count_partial) {
  ------------------
  |  Branch (2022:6): [True: 0, False: 99]
  ------------------
 2023|      0|		return false;
 2024|      0|	}
 2025|       |
 2026|     99|	f = &gif->frames[frame];
 2027|     99|	if (f->info.local_palette == false) {
  ------------------
  |  Branch (2027:6): [True: 32, False: 67]
  ------------------
 2028|     32|		return false;
 2029|     32|	}
 2030|       |
 2031|     67|	*entries = 2 << (f->flags & NSGIF_COLOUR_TABLE_SIZE_MASK);
  ------------------
  |  |  166|     67|#define NSGIF_COLOUR_TABLE_SIZE_MASK 0x07
  ------------------
 2032|     67|	nsgif__colour_table_decode(table, &gif->colour_layout,
 2033|     67|			*entries, gif->buf + f->colour_table_offset);
 2034|       |
 2035|     67|	return true;
 2036|     99|}
nsgif_strerror:
 2040|    285|{
 2041|    285|	static const char *const str[] = {
 2042|    285|		[NSGIF_OK]                = "Success",
 2043|    285|		[NSGIF_ERR_OOM]           = "Out of memory",
 2044|    285|		[NSGIF_ERR_DATA]          = "Invalid source data",
 2045|    285|		[NSGIF_ERR_BAD_FRAME]     = "Requested frame does not exist",
 2046|    285|		[NSGIF_ERR_DATA_FRAME]    = "Invalid frame data",
 2047|    285|		[NSGIF_ERR_END_OF_DATA]   = "Unexpected end of GIF source data",
 2048|    285|		[NSGIF_ERR_DATA_COMPLETE] = "Can't add data to completed GIF",
 2049|    285|		[NSGIF_ERR_FRAME_DISPLAY] = "Frame can't be displayed",
 2050|    285|		[NSGIF_ERR_ANIMATION_END] = "Animation complete",
 2051|    285|	};
 2052|       |
 2053|    285|	if (err >= NSGIF_ARRAY_LEN(str) || str[err] == NULL) {
  ------------------
  |  |  139|    570|#define NSGIF_ARRAY_LEN(_a) ((sizeof(_a)) / (sizeof(*_a)))
  ------------------
  |  Branch (2053:6): [True: 0, False: 285]
  |  Branch (2053:37): [True: 0, False: 285]
  ------------------
 2054|      0|		return "Unknown error";
 2055|      0|	}
 2056|       |
 2057|    285|	return str[err];
 2058|    285|}
gif.c:nsgif__bitmap_fmt_to_colour_layout:
 1424|    300|{
 1425|    300|	bool le = nsgif__host_is_little_endian();
 1426|       |
 1427|       |	/* Map endian-dependant formats to byte-wise format for the host. */
 1428|    300|	switch (bitmap_fmt) {
 1429|      0|	case NSGIF_BITMAP_FMT_RGBA8888:
  ------------------
  |  Branch (1429:2): [True: 0, False: 300]
  ------------------
 1430|      0|		bitmap_fmt = (le) ? NSGIF_BITMAP_FMT_A8B8G8R8
  ------------------
  |  Branch (1430:16): [True: 0, False: 0]
  ------------------
 1431|      0|		                  : NSGIF_BITMAP_FMT_R8G8B8A8;
 1432|      0|		break;
 1433|      0|	case NSGIF_BITMAP_FMT_BGRA8888:
  ------------------
  |  Branch (1433:2): [True: 0, False: 300]
  ------------------
 1434|      0|		bitmap_fmt = (le) ? NSGIF_BITMAP_FMT_A8R8G8B8
  ------------------
  |  Branch (1434:16): [True: 0, False: 0]
  ------------------
 1435|      0|		                  : NSGIF_BITMAP_FMT_B8G8R8A8;
 1436|      0|		break;
 1437|      0|	case NSGIF_BITMAP_FMT_ARGB8888:
  ------------------
  |  Branch (1437:2): [True: 0, False: 300]
  ------------------
 1438|      0|		bitmap_fmt = (le) ? NSGIF_BITMAP_FMT_B8G8R8A8
  ------------------
  |  Branch (1438:16): [True: 0, False: 0]
  ------------------
 1439|      0|		                  : NSGIF_BITMAP_FMT_A8R8G8B8;
 1440|      0|		break;
 1441|      0|	case NSGIF_BITMAP_FMT_ABGR8888:
  ------------------
  |  Branch (1441:2): [True: 0, False: 300]
  ------------------
 1442|      0|		bitmap_fmt = (le) ? NSGIF_BITMAP_FMT_R8G8B8A8
  ------------------
  |  Branch (1442:16): [True: 0, False: 0]
  ------------------
 1443|      0|		                  : NSGIF_BITMAP_FMT_A8B8G8R8;
 1444|      0|		break;
 1445|    300|	default:
  ------------------
  |  Branch (1445:2): [True: 300, False: 0]
  ------------------
 1446|    300|		break;
 1447|    300|	}
 1448|       |
 1449|       |	/* Set up colour component order for bitmap format. */
 1450|    300|	switch (bitmap_fmt) {
 1451|      0|	default:
  ------------------
  |  Branch (1451:2): [True: 0, False: 300]
  ------------------
 1452|       |		/* Fall through. */
 1453|    300|	case NSGIF_BITMAP_FMT_R8G8B8A8:
  ------------------
  |  Branch (1453:2): [True: 300, False: 0]
  ------------------
 1454|    300|		return (struct nsgif_colour_layout) {
 1455|    300|			.r = 0,
 1456|    300|			.g = 1,
 1457|    300|			.b = 2,
 1458|    300|			.a = 3,
 1459|    300|		};
 1460|       |
 1461|      0|	case NSGIF_BITMAP_FMT_B8G8R8A8:
  ------------------
  |  Branch (1461:2): [True: 0, False: 300]
  ------------------
 1462|      0|		return (struct nsgif_colour_layout) {
 1463|      0|			.b = 0,
 1464|      0|			.g = 1,
 1465|      0|			.r = 2,
 1466|      0|			.a = 3,
 1467|      0|		};
 1468|       |
 1469|      0|	case NSGIF_BITMAP_FMT_A8R8G8B8:
  ------------------
  |  Branch (1469:2): [True: 0, False: 300]
  ------------------
 1470|      0|		return (struct nsgif_colour_layout) {
 1471|      0|			.a = 0,
 1472|      0|			.r = 1,
 1473|      0|			.g = 2,
 1474|      0|			.b = 3,
 1475|      0|		};
 1476|       |
 1477|      0|	case NSGIF_BITMAP_FMT_A8B8G8R8:
  ------------------
  |  Branch (1477:2): [True: 0, False: 300]
  ------------------
 1478|      0|		return (struct nsgif_colour_layout) {
 1479|      0|			.a = 0,
 1480|      0|			.b = 1,
 1481|      0|			.g = 2,
 1482|      0|			.r = 3,
 1483|      0|		};
 1484|    300|	}
 1485|    300|}
gif.c:nsgif__host_is_little_endian:
 1416|    300|{
 1417|    300|	const uint16_t test = 1;
 1418|       |
 1419|    300|	return ((const uint8_t *) &test)[0];
 1420|    300|}
gif.c:nsgif__parse_header:
 1540|    300|{
 1541|    300|	const uint8_t *data = *pos;
 1542|    300|	size_t len = gif->buf + gif->buf_len - data;
 1543|       |
 1544|    300|	if (len < 6) {
  ------------------
  |  Branch (1544:6): [True: 1, False: 299]
  ------------------
 1545|      1|		return NSGIF_ERR_END_OF_DATA;
 1546|      1|	}
 1547|       |
 1548|    299|	if (strncmp((const char *) data, "GIF", 3) != 0) {
  ------------------
  |  Branch (1548:6): [True: 0, False: 299]
  ------------------
 1549|      0|		return NSGIF_ERR_DATA;
 1550|      0|	}
 1551|    299|	data += 3;
 1552|       |
 1553|    299|	if (strict == true) {
  ------------------
  |  Branch (1553:6): [True: 0, False: 299]
  ------------------
 1554|      0|		if ((strncmp((const char *) data, "87a", 3) != 0) &&
  ------------------
  |  Branch (1554:7): [True: 0, False: 0]
  ------------------
 1555|      0|		    (strncmp((const char *) data, "89a", 3) != 0)) {
  ------------------
  |  Branch (1555:7): [True: 0, False: 0]
  ------------------
 1556|      0|			return NSGIF_ERR_DATA;
 1557|      0|		}
 1558|      0|	}
 1559|    299|	data += 3;
 1560|       |
 1561|    299|	*pos = data;
 1562|    299|	return NSGIF_OK;
 1563|    299|}
gif.c:nsgif__parse_logical_screen_descriptor:
 1587|    299|{
 1588|    299|	const uint8_t *data = *pos;
 1589|    299|	size_t len = gif->buf + gif->buf_len - data;
 1590|       |
 1591|    299|	if (len < 7) {
  ------------------
  |  Branch (1591:6): [True: 6, False: 293]
  ------------------
 1592|      6|		return NSGIF_ERR_END_OF_DATA;
 1593|      6|	}
 1594|       |
 1595|    293|	gif->info.width = data[0] | (data[1] << 8);
 1596|    293|	gif->info.height = data[2] | (data[3] << 8);
 1597|    293|	gif->info.global_palette = data[4] & NSGIF_COLOUR_TABLE_MASK;
  ------------------
  |  |  165|    293|#define NSGIF_COLOUR_TABLE_MASK 0x80
  ------------------
 1598|    293|	gif->colour_table_size = 2 << (data[4] & NSGIF_COLOUR_TABLE_SIZE_MASK);
  ------------------
  |  |  166|    293|#define NSGIF_COLOUR_TABLE_SIZE_MASK 0x07
  ------------------
 1599|    293|	gif->bg_index = data[5];
 1600|    293|	gif->aspect_ratio = data[6];
 1601|    293|	gif->info.loop_max = 1;
 1602|       |
 1603|    293|	*pos += 7;
 1604|    293|	return NSGIF_OK;
 1605|    299|}
gif.c:nsgif__colour_table_extract:
 1115|    280|{
 1116|    280|	if (data_len < colour_table_entries * 3) {
  ------------------
  |  Branch (1116:6): [True: 12, False: 268]
  ------------------
 1117|     12|		return NSGIF_ERR_END_OF_DATA;
 1118|     12|	}
 1119|       |
 1120|    268|	if (decode) {
  ------------------
  |  Branch (1120:6): [True: 212, False: 56]
  ------------------
 1121|    212|		nsgif__colour_table_decode(colour_table, layout,
 1122|    212|				colour_table_entries, data);
 1123|    212|	}
 1124|       |
 1125|    268|	*used = colour_table_entries * 3;
 1126|    268|	return NSGIF_OK;
 1127|    280|}
gif.c:nsgif__error_from_lzw:
  177|     91|{
  178|     91|	static const nsgif_error g_res[] = {
  179|     91|		[LZW_OK]        = NSGIF_OK,
  180|     91|		[LZW_NO_MEM]    = NSGIF_ERR_OOM,
  181|     91|		[LZW_OK_EOD]    = NSGIF_ERR_END_OF_DATA,
  182|     91|		[LZW_NO_DATA]   = NSGIF_ERR_END_OF_DATA,
  183|     91|		[LZW_EOI_CODE]  = NSGIF_ERR_DATA_FRAME,
  184|     91|		[LZW_BAD_ICODE] = NSGIF_ERR_DATA_FRAME,
  185|     91|		[LZW_BAD_CODE]  = NSGIF_ERR_DATA_FRAME,
  186|     91|	};
  187|     91|	assert(l_res != LZW_BAD_PARAM);
  188|     91|	assert(l_res != LZW_NO_COLOUR);
  189|     91|	return g_res[l_res];
  190|     91|}
gif.c:nsgif__process_frame:
 1315|    627|{
 1316|    627|	nsgif_error ret;
 1317|    627|	const uint8_t *pos;
 1318|    627|	const uint8_t *end;
 1319|    627|	struct nsgif_frame *frame;
 1320|       |
 1321|    627|	frame = nsgif__get_frame(gif, frame_idx);
 1322|    627|	if (frame == NULL) {
  ------------------
  |  Branch (1322:6): [True: 0, False: 627]
  ------------------
 1323|      0|		return NSGIF_ERR_OOM;
 1324|      0|	}
 1325|       |
 1326|    627|	end = gif->buf + gif->buf_len;
 1327|       |
 1328|    627|	if (decode) {
  ------------------
  |  Branch (1328:6): [True: 173, False: 454]
  ------------------
 1329|    173|		pos = gif->buf + frame->frame_offset;
 1330|       |
 1331|       |		/* Ensure this frame is supposed to be decoded */
 1332|    173|		if (frame->info.display == false) {
  ------------------
  |  Branch (1332:7): [True: 0, False: 173]
  ------------------
 1333|      0|			return NSGIF_OK;
 1334|      0|		}
 1335|       |
 1336|       |		/* Ensure the frame is in range to decode */
 1337|    173|		if (frame_idx > gif->frame_count_partial) {
  ------------------
  |  Branch (1337:7): [True: 0, False: 173]
  ------------------
 1338|      0|			return NSGIF_ERR_END_OF_DATA;
 1339|      0|		}
 1340|       |
 1341|       |		/* Done if frame is already decoded */
 1342|    173|		if (frame_idx == gif->decoded_frame) {
  ------------------
  |  Branch (1342:7): [True: 0, False: 173]
  ------------------
 1343|      0|			return NSGIF_OK;
 1344|      0|		}
 1345|    454|	} else {
 1346|    454|		pos = gif->buf + gif->buf_pos;
 1347|       |
 1348|       |		/* Check if we've finished */
 1349|    454|		if (pos < end && pos[0] == NSGIF_TRAILER) {
  ------------------
  |  |  168|    446|#define NSGIF_TRAILER 0x3b
  ------------------
  |  Branch (1349:7): [True: 446, False: 8]
  |  Branch (1349:20): [True: 28, False: 418]
  ------------------
 1350|     28|			return NSGIF_OK;
 1351|     28|		}
 1352|    454|	}
 1353|       |
 1354|    599|	ret = nsgif__parse_frame_extensions(gif, frame, &pos, !decode);
 1355|    599|	if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1355:6): [True: 36, False: 563]
  ------------------
 1356|     36|		goto cleanup;
 1357|     36|	}
 1358|       |
 1359|    563|	ret = nsgif__parse_image_descriptor(gif, frame, &pos, !decode);
 1360|    563|	if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1360:6): [True: 92, False: 471]
  ------------------
 1361|     92|		goto cleanup;
 1362|     92|	}
 1363|       |
 1364|    471|	ret = nsgif__parse_colour_table(gif, frame, &pos, decode);
 1365|    471|	if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1365:6): [True: 8, False: 463]
  ------------------
 1366|      8|		goto cleanup;
 1367|      8|	}
 1368|       |
 1369|    463|	ret = nsgif__parse_image_data(gif, frame, &pos, decode);
 1370|    463|	if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1370:6): [True: 175, False: 288]
  ------------------
 1371|    175|		goto cleanup;
 1372|    175|	}
 1373|       |
 1374|    599|cleanup:
 1375|    599|	if (!decode) {
  ------------------
  |  Branch (1375:6): [True: 426, False: 173]
  ------------------
 1376|    426|		gif->buf_pos = pos - gif->buf;
 1377|    426|	}
 1378|       |
 1379|    599|	return ret;
 1380|    463|}
gif.c:nsgif__get_frame:
 1268|    627|{
 1269|    627|	struct nsgif_frame *frame;
 1270|       |
 1271|    627|	if (gif->frame_holders > frame_idx) {
  ------------------
  |  Branch (1271:6): [True: 173, False: 454]
  ------------------
 1272|    173|		frame = &gif->frames[frame_idx];
 1273|    454|	} else {
 1274|       |		/* Allocate more memory */
 1275|    454|		size_t count = frame_idx + 1;
 1276|    454|		struct nsgif_frame *temp;
 1277|       |
 1278|    454|		temp = realloc(gif->frames, count * sizeof(*frame));
 1279|    454|		if (temp == NULL) {
  ------------------
  |  Branch (1279:7): [True: 0, False: 454]
  ------------------
 1280|      0|			return NULL;
 1281|      0|		}
 1282|    454|		gif->frames = temp;
 1283|    454|		gif->frame_holders = count;
 1284|       |
 1285|    454|		frame = &gif->frames[frame_idx];
 1286|       |
 1287|    454|		frame->info.local_palette = false;
 1288|    454|		frame->info.transparency = false;
 1289|    454|		frame->info.display = false;
 1290|    454|		frame->info.disposal = 0;
 1291|    454|		frame->info.delay = 10;
 1292|       |
 1293|    454|		frame->transparency_index = NSGIF_NO_TRANSPARENCY;
  ------------------
  |  |  162|    454|#define NSGIF_NO_TRANSPARENCY (0xFFFFFFFFu)
  ------------------
 1294|    454|		frame->frame_offset = gif->buf_pos;
 1295|    454|		frame->redraw_required = false;
 1296|    454|		frame->lzw_data_length = 0;
 1297|    454|		frame->decoded = false;
 1298|    454|	}
 1299|       |
 1300|    627|	return frame;
 1301|    627|}
gif.c:nsgif__parse_frame_extensions:
  893|    599|{
  894|    599|	enum {
  895|    599|		GIF_EXT_INTRODUCER      = 0x21,
  896|    599|		GIF_EXT_GRAPHIC_CONTROL = 0xf9,
  897|    599|		GIF_EXT_COMMENT         = 0xfe,
  898|    599|		GIF_EXT_PLAIN_TEXT      = 0x01,
  899|    599|		GIF_EXT_APPLICATION     = 0xff,
  900|    599|	};
  901|    599|	const uint8_t *nsgif_data = *pos;
  902|    599|	const uint8_t *nsgif_end = gif->buf + gif->buf_len;
  903|    599|	int nsgif_bytes = nsgif_end - nsgif_data;
  904|       |
  905|       |	/* Initialise the extensions */
  906|  2.37k|	while (nsgif_bytes > 0 && nsgif_data[0] == GIF_EXT_INTRODUCER) {
  ------------------
  |  Branch (906:9): [True: 2.35k, False: 12]
  |  Branch (906:28): [True: 1.80k, False: 551]
  ------------------
  907|  1.80k|		bool block_step = true;
  908|  1.80k|		nsgif_error ret;
  909|       |
  910|  1.80k|		nsgif_data++;
  911|  1.80k|		nsgif_bytes--;
  912|       |
  913|  1.80k|		if (nsgif_bytes == 0) {
  ------------------
  |  Branch (913:7): [True: 3, False: 1.80k]
  ------------------
  914|      3|			return NSGIF_ERR_END_OF_DATA;
  915|      3|		}
  916|       |
  917|       |		/* Switch on extension label */
  918|  1.80k|		switch (nsgif_data[0]) {
  919|    349|		case GIF_EXT_GRAPHIC_CONTROL:
  ------------------
  |  Branch (919:3): [True: 349, False: 1.45k]
  ------------------
  920|    349|			if (decode) {
  ------------------
  |  Branch (920:8): [True: 228, False: 121]
  ------------------
  921|    228|				ret = nsgif__parse_extension_graphic_control(
  922|    228|						frame,
  923|    228|						nsgif_data,
  924|    228|						nsgif_bytes);
  925|    228|				if (ret != NSGIF_OK) {
  ------------------
  |  Branch (925:9): [True: 1, False: 227]
  ------------------
  926|      1|					return ret;
  927|      1|				}
  928|    228|			}
  929|    348|			break;
  930|       |
  931|  1.32k|		case GIF_EXT_APPLICATION:
  ------------------
  |  Branch (931:3): [True: 1.32k, False: 480]
  ------------------
  932|  1.32k|			if (decode) {
  ------------------
  |  Branch (932:8): [True: 1.30k, False: 22]
  ------------------
  933|  1.30k|				ret = nsgif__parse_extension_application(
  934|  1.30k|						gif, nsgif_data, nsgif_bytes);
  935|  1.30k|				if (ret != NSGIF_OK) {
  ------------------
  |  Branch (935:9): [True: 3, False: 1.29k]
  ------------------
  936|      3|					return ret;
  937|      3|				}
  938|  1.30k|			}
  939|  1.32k|			break;
  940|       |
  941|  1.32k|		case GIF_EXT_COMMENT:
  ------------------
  |  Branch (941:3): [True: 21, False: 1.78k]
  ------------------
  942|       |			/* Move the pointer to the first data sub-block Skip 1
  943|       |			 * byte for the extension label. */
  944|     21|			++nsgif_data;
  945|     21|			block_step = false;
  946|     21|			break;
  947|       |
  948|    110|		default:
  ------------------
  |  Branch (948:3): [True: 110, False: 1.69k]
  ------------------
  949|    110|			break;
  950|  1.80k|		}
  951|       |
  952|  1.80k|		if (block_step) {
  ------------------
  |  Branch (952:7): [True: 1.77k, False: 21]
  ------------------
  953|       |			/* Move the pointer to the first data sub-block Skip 2
  954|       |			 * bytes for the extension label and size fields Skip
  955|       |			 * the extension size itself
  956|       |			 */
  957|  1.77k|			if (nsgif_bytes < 2) {
  ------------------
  |  Branch (957:8): [True: 1, False: 1.77k]
  ------------------
  958|      1|				return NSGIF_ERR_END_OF_DATA;
  959|      1|			}
  960|  1.77k|			nsgif_data += 2 + nsgif_data[1];
  961|  1.77k|		}
  962|       |
  963|       |		/* Repeatedly skip blocks until we get a zero block or run out
  964|       |		 * of data.  This data is ignored by this gif decoder. */
  965|  10.3k|		while (nsgif_data < nsgif_end && nsgif_data[0] != NSGIF_BLOCK_TERMINATOR) {
  ------------------
  |  |  167|  10.3k|#define NSGIF_BLOCK_TERMINATOR 0x00
  ------------------
  |  Branch (965:10): [True: 10.3k, False: 4]
  |  Branch (965:36): [True: 8.53k, False: 1.76k]
  ------------------
  966|  8.53k|			nsgif_data += nsgif_data[0] + 1;
  967|  8.53k|			if (nsgif_data >= nsgif_end) {
  ------------------
  |  Branch (967:8): [True: 28, False: 8.50k]
  ------------------
  968|     28|				return NSGIF_ERR_END_OF_DATA;
  969|     28|			}
  970|  8.53k|		}
  971|  1.77k|		nsgif_data++;
  972|  1.77k|		nsgif_bytes = nsgif_end - nsgif_data;
  973|  1.77k|	}
  974|       |
  975|    563|	if (nsgif_data > nsgif_end) {
  ------------------
  |  Branch (975:6): [True: 4, False: 559]
  ------------------
  976|      4|		nsgif_data = nsgif_end;
  977|      4|	}
  978|       |
  979|       |	/* Set buffer position and return */
  980|    563|	*pos = nsgif_data;
  981|    563|	return NSGIF_OK;
  982|    599|}
gif.c:nsgif__parse_extension_graphic_control:
  752|    228|{
  753|    228|	enum {
  754|    228|		GIF_MASK_TRANSPARENCY = 0x01,
  755|    228|		GIF_MASK_DISPOSAL     = 0x1c,
  756|    228|	};
  757|       |
  758|       |	/* 6-byte Graphic Control Extension is:
  759|       |	 *
  760|       |	 *  +0  CHAR    Graphic Control Label
  761|       |	 *  +1  CHAR    Block Size
  762|       |	 *  +2  CHAR    __Packed Fields__
  763|       |	 *              3BITS   Reserved
  764|       |	 *              3BITS   Disposal Method
  765|       |	 *              1BIT    User Input Flag
  766|       |	 *              1BIT    Transparent Color Flag
  767|       |	 *  +3  SHORT   Delay Time
  768|       |	 *  +5  CHAR    Transparent Color Index
  769|       |	 */
  770|    228|	if (len < 6) {
  ------------------
  |  Branch (770:6): [True: 1, False: 227]
  ------------------
  771|      1|		return NSGIF_ERR_END_OF_DATA;
  772|      1|	}
  773|       |
  774|    227|	frame->info.delay = data[3] | (data[4] << 8);
  775|       |
  776|    227|	if (data[2] & GIF_MASK_TRANSPARENCY) {
  ------------------
  |  Branch (776:6): [True: 147, False: 80]
  ------------------
  777|    147|		frame->info.transparency = true;
  778|    147|		frame->transparency_index = data[5];
  779|    147|	}
  780|       |
  781|    227|	frame->info.disposal = ((data[2] & GIF_MASK_DISPOSAL) >> 2);
  782|       |	/* I have encountered documentation and GIFs in the
  783|       |	 * wild that use 0x04 to restore the previous frame,
  784|       |	 * rather than the officially documented 0x03.  I
  785|       |	 * believe some (older?)  software may even actually
  786|       |	 * export this way.  We handle this as a type of
  787|       |	 * "quirks" mode. */
  788|    227|	if (frame->info.disposal == NSGIF_DISPOSAL_RESTORE_QUIRK) {
  ------------------
  |  Branch (788:6): [True: 22, False: 205]
  ------------------
  789|     22|		frame->info.disposal = NSGIF_DISPOSAL_RESTORE_PREV;
  790|     22|	}
  791|       |
  792|       |	/* if we are clearing the background then we need to
  793|       |	 * redraw enough to cover the previous frame too. */
  794|    227|	frame->redraw_required =
  795|    227|			frame->info.disposal == NSGIF_DISPOSAL_RESTORE_BG ||
  ------------------
  |  Branch (795:4): [True: 30, False: 197]
  ------------------
  796|    227|			frame->info.disposal == NSGIF_DISPOSAL_RESTORE_PREV;
  ------------------
  |  Branch (796:4): [True: 37, False: 160]
  ------------------
  797|       |
  798|    227|	return NSGIF_OK;
  799|    228|}
gif.c:nsgif__parse_extension_application:
  842|  1.30k|{
  843|       |	/* 14-byte+ Application Extension is:
  844|       |	 *
  845|       |	 *  +0    CHAR    Application Extension Label
  846|       |	 *  +1    CHAR    Block Size
  847|       |	 *  +2    8CHARS  Application Identifier
  848|       |	 *  +10   3CHARS  Appl. Authentication Code
  849|       |	 *  +13   1-256   Application Data (Data sub-blocks)
  850|       |	 */
  851|  1.30k|	if (len < 17) {
  ------------------
  |  Branch (851:6): [True: 3, False: 1.29k]
  ------------------
  852|      3|		return NSGIF_ERR_END_OF_DATA;
  853|      3|	}
  854|       |
  855|  1.29k|	if (nsgif__app_ext_is_loop_count(data, len)) {
  ------------------
  |  Branch (855:6): [True: 444, False: 855]
  ------------------
  856|    444|		enum {
  857|    444|			EXT_LOOP_COUNT_SUB_BLOCK_SIZE = 0x03,
  858|    444|			EXT_LOOP_COUNT_SUB_BLOCK_ID   = 0x01,
  859|    444|		};
  860|    444|		if ((data[13] == EXT_LOOP_COUNT_SUB_BLOCK_SIZE) &&
  ------------------
  |  Branch (860:7): [True: 303, False: 141]
  ------------------
  861|    444|		    (data[14] == EXT_LOOP_COUNT_SUB_BLOCK_ID)) {
  ------------------
  |  Branch (861:7): [True: 126, False: 177]
  ------------------
  862|    126|			gif->info.loop_max = data[15] | (data[16] << 8);
  863|       |
  864|       |			/* The value in the source data means repeat N times
  865|       |			 * after the first implied play. A value of zero has
  866|       |			 * the special meaning of loop forever. (The only way
  867|       |			 * to play the animation once is  not to have this
  868|       |			 * extension at all. */
  869|    126|			if (gif->info.loop_max > 0) {
  ------------------
  |  Branch (869:8): [True: 121, False: 5]
  ------------------
  870|    121|				gif->info.loop_max++;
  871|    121|			}
  872|    126|		}
  873|    444|	}
  874|       |
  875|  1.29k|	return NSGIF_OK;
  876|  1.30k|}
gif.c:nsgif__app_ext_is_loop_count:
  811|  1.29k|{
  812|  1.29k|	enum {
  813|  1.29k|		EXT_LOOP_COUNT_BLOCK_SIZE = 0x0b,
  814|  1.29k|	};
  815|       |
  816|  1.29k|	assert(len > 13);
  817|  1.29k|	(void)(len);
  818|       |
  819|  1.29k|	if (data[1] == EXT_LOOP_COUNT_BLOCK_SIZE) {
  ------------------
  |  Branch (819:6): [True: 1.17k, False: 121]
  ------------------
  820|  1.17k|		if (strncmp((const char *)data + 2, "NETSCAPE2.0", 11) == 0 ||
  ------------------
  |  Branch (820:7): [True: 10, False: 1.16k]
  ------------------
  821|  1.17k|		    strncmp((const char *)data + 2, "ANIMEXTS1.0", 11) == 0) {
  ------------------
  |  Branch (821:7): [True: 434, False: 734]
  ------------------
  822|    444|			return true;
  823|    444|		}
  824|  1.17k|	}
  825|       |
  826|    855|	return false;
  827|  1.29k|}
gif.c:nsgif__parse_image_descriptor:
 1012|    563|{
 1013|    563|	const uint8_t *data = *pos;
 1014|    563|	size_t len = gif->buf + gif->buf_len - data;
 1015|    563|	enum {
 1016|    563|		NSGIF_IMAGE_DESCRIPTOR_LEN = 10u,
 1017|    563|		NSGIF_IMAGE_SEPARATOR      = 0x2Cu,
 1018|    563|		NSGIF_MASK_INTERLACE       = 0x40u,
 1019|    563|	};
 1020|       |
 1021|    563|	assert(gif != NULL);
 1022|    563|	assert(frame != NULL);
 1023|       |
 1024|    563|	if (len < NSGIF_IMAGE_DESCRIPTOR_LEN) {
  ------------------
  |  Branch (1024:6): [True: 42, False: 521]
  ------------------
 1025|     42|		return NSGIF_ERR_END_OF_DATA;
 1026|     42|	}
 1027|       |
 1028|    521|	if (decode) {
  ------------------
  |  Branch (1028:6): [True: 348, False: 173]
  ------------------
 1029|    348|		uint32_t x, y, w, h;
 1030|       |
 1031|    348|		if (data[0] != NSGIF_IMAGE_SEPARATOR) {
  ------------------
  |  Branch (1031:7): [True: 50, False: 298]
  ------------------
 1032|     50|			return NSGIF_ERR_DATA_FRAME;
 1033|     50|		}
 1034|       |
 1035|    298|		x = data[1] | (data[2] << 8);
 1036|    298|		y = data[3] | (data[4] << 8);
 1037|    298|		w = data[5] | (data[6] << 8);
 1038|    298|		h = data[7] | (data[8] << 8);
 1039|    298|		frame->flags = data[9];
 1040|       |
 1041|    298|		frame->info.rect.x0 = x;
 1042|    298|		frame->info.rect.y0 = y;
 1043|    298|		frame->info.rect.x1 = x + w;
 1044|    298|		frame->info.rect.y1 = y + h;
 1045|       |
 1046|    298|		frame->info.interlaced = frame->flags & NSGIF_MASK_INTERLACE;
 1047|       |
 1048|       |		/* Allow first frame to grow image dimensions. */
 1049|    298|		if (gif->info.frame_count == 0) {
  ------------------
  |  Branch (1049:7): [True: 208, False: 90]
  ------------------
 1050|    208|			if (x + w > gif->info.width) {
  ------------------
  |  Branch (1050:8): [True: 97, False: 111]
  ------------------
 1051|     97|				gif->info.width = x + w;
 1052|     97|			}
 1053|    208|			if (y + h > gif->info.height) {
  ------------------
  |  Branch (1053:8): [True: 82, False: 126]
  ------------------
 1054|     82|				gif->info.height = y + h;
 1055|     82|			}
 1056|    208|		}
 1057|    298|	}
 1058|       |
 1059|    471|	*pos += NSGIF_IMAGE_DESCRIPTOR_LEN;
 1060|    471|	return NSGIF_OK;
 1061|    521|}
gif.c:nsgif__parse_colour_table:
 1145|    471|{
 1146|    471|	nsgif_error ret;
 1147|    471|	const uint8_t *data = *pos;
 1148|    471|	size_t len = gif->buf + gif->buf_len - data;
 1149|    471|	size_t used_bytes;
 1150|       |
 1151|    471|	assert(gif != NULL);
 1152|    471|	assert(frame != NULL);
 1153|       |
 1154|    471|	if ((frame->flags & NSGIF_COLOUR_TABLE_MASK) == 0) {
  ------------------
  |  |  165|    471|#define NSGIF_COLOUR_TABLE_MASK 0x80
  ------------------
  |  Branch (1154:6): [True: 392, False: 79]
  ------------------
 1155|    392|		gif->colour_table = gif->global_colour_table;
 1156|    392|		return NSGIF_OK;
 1157|    392|	}
 1158|       |
 1159|     79|	if (decode == false) {
  ------------------
  |  Branch (1159:6): [True: 64, False: 15]
  ------------------
 1160|     64|		frame->colour_table_offset = *pos - gif->buf;
 1161|     64|	}
 1162|       |
 1163|     79|	ret = nsgif__colour_table_extract(
 1164|     79|			gif->local_colour_table, &gif->colour_layout,
 1165|     79|			2 << (frame->flags & NSGIF_COLOUR_TABLE_SIZE_MASK),
  ------------------
  |  |  166|     79|#define NSGIF_COLOUR_TABLE_SIZE_MASK 0x07
  ------------------
 1166|     79|			data, len, &used_bytes, decode);
 1167|     79|	if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1167:6): [True: 8, False: 71]
  ------------------
 1168|      8|		return ret;
 1169|      8|	}
 1170|     71|	*pos += used_bytes;
 1171|       |
 1172|     71|	if (decode) {
  ------------------
  |  Branch (1172:6): [True: 15, False: 56]
  ------------------
 1173|     15|		gif->colour_table = gif->local_colour_table;
 1174|     56|	} else {
 1175|     56|		frame->info.local_palette = true;
 1176|     56|	}
 1177|       |
 1178|     71|	return NSGIF_OK;
 1179|     79|}
gif.c:nsgif__parse_image_data:
 1197|    463|{
 1198|    463|	const uint8_t *data = *pos;
 1199|    463|	size_t len = gif->buf + gif->buf_len - data;
 1200|    463|	uint32_t frame_idx = frame - gif->frames;
 1201|    463|	uint8_t minimum_code_size;
 1202|    463|	nsgif_error ret;
 1203|       |
 1204|    463|	assert(gif != NULL);
 1205|    463|	assert(frame != NULL);
 1206|       |
 1207|    463|	if (!decode) {
  ------------------
  |  Branch (1207:6): [True: 290, False: 173]
  ------------------
 1208|    290|		gif->frame_count_partial = frame_idx + 1;
 1209|    290|	}
 1210|       |
 1211|       |	/* Ensure sufficient data remains.  A gif trailer or a minimum lzw code
 1212|       |	 * followed by a gif trailer is treated as OK, although without any
 1213|       |	 * image data. */
 1214|    463|	switch (len) {
 1215|    456|		default: if (data[0] == NSGIF_TRAILER) return NSGIF_OK;
  ------------------
  |  |  168|    456|#define NSGIF_TRAILER 0x3b
  ------------------
  |  Branch (1215:3): [True: 456, False: 7]
  |  Branch (1215:16): [True: 1, False: 455]
  ------------------
 1216|    455|			break;
 1217|    455|		case 2: if (data[1] == NSGIF_TRAILER) return NSGIF_OK;
  ------------------
  |  |  168|      1|#define NSGIF_TRAILER 0x3b
  ------------------
  |  Branch (1217:3): [True: 1, False: 462]
  |  Branch (1217:15): [True: 0, False: 1]
  ------------------
 1218|       |			/* Fall through. */
 1219|      5|		case 1: if (data[0] == NSGIF_TRAILER) return NSGIF_OK;
  ------------------
  |  |  168|      5|#define NSGIF_TRAILER 0x3b
  ------------------
  |  Branch (1219:3): [True: 4, False: 459]
  |  Branch (1219:15): [True: 1, False: 4]
  ------------------
 1220|       |			/* Fall through. */
 1221|      6|		case 0: return NSGIF_ERR_END_OF_DATA;
  ------------------
  |  Branch (1221:3): [True: 2, False: 461]
  ------------------
 1222|    463|	}
 1223|       |
 1224|    455|	minimum_code_size = data[0];
 1225|    455|	if (minimum_code_size >= LZW_CODE_MAX) {
  ------------------
  |  |   21|    455|#define LZW_CODE_MAX 12
  ------------------
  |  Branch (1225:6): [True: 7, False: 448]
  ------------------
 1226|      7|		return NSGIF_ERR_DATA_FRAME;
 1227|      7|	}
 1228|       |
 1229|    448|	if (decode) {
  ------------------
  |  Branch (1229:6): [True: 173, False: 275]
  ------------------
 1230|    173|		ret = nsgif__update_bitmap(gif, frame, data, frame_idx);
 1231|    275|	} else {
 1232|    275|		uint32_t block_size = 0;
 1233|       |
 1234|       |		/* Skip the minimum code size. */
 1235|    275|		data++;
 1236|    275|		len--;
 1237|       |
 1238|  1.12k|		while (block_size != 1) {
  ------------------
  |  Branch (1238:10): [True: 957, False: 166]
  ------------------
 1239|    957|			if (len < 1) {
  ------------------
  |  Branch (1239:8): [True: 13, False: 944]
  ------------------
 1240|     13|				return NSGIF_ERR_END_OF_DATA;
 1241|     13|			}
 1242|    944|			block_size = data[0] + 1;
 1243|       |			/* Check if the frame data runs off the end of the file */
 1244|    944|			if (block_size > len) {
  ------------------
  |  Branch (1244:8): [True: 96, False: 848]
  ------------------
 1245|     96|				frame->lzw_data_length += len;
 1246|     96|				return NSGIF_ERR_END_OF_DATA;
 1247|     96|			}
 1248|       |
 1249|    848|			len -= block_size;
 1250|    848|			data += block_size;
 1251|    848|			frame->lzw_data_length += block_size;
 1252|    848|		}
 1253|       |
 1254|    166|		*pos = data;
 1255|       |
 1256|    166|		gif->info.frame_count = frame_idx + 1;
 1257|    166|		gif->frames[frame_idx].info.display = true;
 1258|       |
 1259|    166|		return NSGIF_OK;
 1260|    275|	}
 1261|       |
 1262|    173|	return ret;
 1263|    448|}
gif.c:nsgif__update_bitmap:
  691|    173|{
  692|    173|	nsgif_error ret;
  693|    173|	uint32_t *bitmap;
  694|       |
  695|    173|	gif->decoded_frame = frame_idx;
  696|       |
  697|    173|	bitmap = nsgif__bitmap_get(gif);
  698|    173|	if (bitmap == NULL) {
  ------------------
  |  Branch (698:6): [True: 0, False: 173]
  ------------------
  699|      0|		return NSGIF_ERR_OOM;
  700|      0|	}
  701|       |
  702|       |	/* Handle any bitmap clearing/restoration required before decoding this
  703|       |	 * frame. */
  704|    173|	if (frame_idx == 0 || gif->decoded_frame == NSGIF_FRAME_INVALID) {
  ------------------
  |  |  156|      0|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
  |  Branch (704:6): [True: 173, False: 0]
  |  Branch (704:24): [True: 0, False: 0]
  ------------------
  705|    173|		nsgif__restore_bg(gif, NULL, bitmap);
  706|       |
  707|    173|	} else {
  708|      0|		struct nsgif_frame *prev = &gif->frames[frame_idx - 1];
  709|       |
  710|      0|		if (prev->info.disposal == NSGIF_DISPOSAL_RESTORE_BG) {
  ------------------
  |  Branch (710:7): [True: 0, False: 0]
  ------------------
  711|      0|			nsgif__restore_bg(gif, prev, bitmap);
  712|       |
  713|      0|		} else if (prev->info.disposal == NSGIF_DISPOSAL_RESTORE_PREV) {
  ------------------
  |  Branch (713:14): [True: 0, False: 0]
  ------------------
  714|      0|			ret = nsgif__recover_frame(gif, bitmap);
  715|      0|			if (ret != NSGIF_OK) {
  ------------------
  |  Branch (715:8): [True: 0, False: 0]
  ------------------
  716|      0|				nsgif__restore_bg(gif, prev, bitmap);
  717|      0|			}
  718|      0|		}
  719|      0|	}
  720|       |
  721|    173|	if (frame->info.disposal == NSGIF_DISPOSAL_RESTORE_PREV) {
  ------------------
  |  Branch (721:6): [True: 16, False: 157]
  ------------------
  722|       |		/* Store the previous frame for later restoration */
  723|     16|		nsgif__record_frame(gif, bitmap);
  724|     16|	}
  725|       |
  726|    173|	ret = nsgif__decode(gif, frame, data, bitmap);
  727|       |
  728|    173|	nsgif__bitmap_modified(gif);
  729|       |
  730|    173|	if (!frame->decoded) {
  ------------------
  |  Branch (730:6): [True: 173, False: 0]
  ------------------
  731|    173|		frame->opaque = nsgif__bitmap_get_opaque(gif);
  732|    173|		frame->decoded = true;
  733|    173|	}
  734|    173|	nsgif__bitmap_set_opaque(gif, frame);
  735|       |
  736|    173|	return ret;
  737|    173|}
gif.c:nsgif__bitmap_get:
  227|    189|{
  228|    189|	nsgif_error ret;
  229|       |
  230|       |	/* Make sure we have a buffer to decode to. */
  231|    189|	ret = nsgif__initialise_sprite(gif, gif->info.width, gif->info.height);
  232|    189|	if (ret != NSGIF_OK) {
  ------------------
  |  Branch (232:6): [True: 0, False: 189]
  ------------------
  233|      0|		return NULL;
  234|      0|	}
  235|       |
  236|    189|	gif->rowspan = gif->info.width;
  237|    189|	if (gif->bitmap.get_rowspan) {
  ------------------
  |  Branch (237:6): [True: 0, False: 189]
  ------------------
  238|      0|		gif->rowspan = gif->bitmap.get_rowspan(gif->frame_image);
  239|      0|	}
  240|       |
  241|       |	/* Get the frame data */
  242|    189|	assert(gif->bitmap.get_buffer);
  243|    189|	return (void *)gif->bitmap.get_buffer(gif->frame_image);
  244|    189|}
gif.c:nsgif__initialise_sprite:
  204|    189|{
  205|       |	/* Already allocated? */
  206|    189|	if (gif->frame_image) {
  ------------------
  |  Branch (206:6): [True: 16, False: 173]
  ------------------
  207|     16|		return NSGIF_OK;
  208|     16|	}
  209|       |
  210|    173|	assert(gif->bitmap.create);
  211|    173|	gif->frame_image = gif->bitmap.create(width, height);
  212|    173|	if (gif->frame_image == NULL) {
  ------------------
  |  Branch (212:6): [True: 0, False: 173]
  ------------------
  213|      0|		return NSGIF_ERR_OOM;
  214|      0|	}
  215|       |
  216|    173|	return NSGIF_OK;
  217|    173|}
gif.c:nsgif__restore_bg:
  643|    173|{
  644|    173|	size_t pixel_bytes = sizeof(*bitmap);
  645|       |
  646|    173|	if (frame == NULL) {
  ------------------
  |  Branch (646:6): [True: 173, False: 0]
  ------------------
  647|    173|		size_t width  = gif->info.width;
  648|    173|		size_t height = gif->info.height;
  649|       |
  650|    173|		memset(bitmap, NSGIF_TRANSPARENT_COLOUR,
  ------------------
  |  |  159|    173|#define NSGIF_TRANSPARENT_COLOUR 0x00
  ------------------
  651|    173|				width * height * pixel_bytes);
  652|    173|	} else {
  653|      0|		uint32_t width  = frame->info.rect.x1 - frame->info.rect.x0;
  654|      0|		uint32_t height = frame->info.rect.y1 - frame->info.rect.y0;
  655|      0|		uint32_t offset_x = frame->info.rect.x0;
  656|      0|		uint32_t offset_y = frame->info.rect.y0;
  657|       |
  658|      0|		if (frame->info.display == false ||
  ------------------
  |  Branch (658:7): [True: 0, False: 0]
  ------------------
  659|      0|		    frame->info.rect.x0 >= gif->info.width ||
  ------------------
  |  Branch (659:7): [True: 0, False: 0]
  ------------------
  660|      0|		    frame->info.rect.y0 >= gif->info.height) {
  ------------------
  |  Branch (660:7): [True: 0, False: 0]
  ------------------
  661|      0|			return;
  662|      0|		}
  663|       |
  664|      0|		width -= gif__clip(offset_x, width, gif->info.width);
  665|      0|		height -= gif__clip(offset_y, height, gif->info.height);
  666|       |
  667|      0|		if (frame->info.transparency) {
  ------------------
  |  Branch (667:7): [True: 0, False: 0]
  ------------------
  668|      0|			for (uint32_t y = 0; y < height; y++) {
  ------------------
  |  Branch (668:25): [True: 0, False: 0]
  ------------------
  669|      0|				uint32_t *scanline = bitmap + offset_x +
  670|      0|						(offset_y + y) * gif->info.width;
  671|      0|				memset(scanline, NSGIF_TRANSPARENT_COLOUR,
  ------------------
  |  |  159|      0|#define NSGIF_TRANSPARENT_COLOUR 0x00
  ------------------
  672|      0|						width * pixel_bytes);
  673|      0|			}
  674|      0|		} else {
  675|      0|			for (uint32_t y = 0; y < height; y++) {
  ------------------
  |  Branch (675:25): [True: 0, False: 0]
  ------------------
  676|      0|				uint32_t *scanline = bitmap + offset_x +
  677|      0|						(offset_y + y) * gif->info.width;
  678|      0|				for (uint32_t x = 0; x < width; x++) {
  ------------------
  |  Branch (678:26): [True: 0, False: 0]
  ------------------
  679|      0|					scanline[x] = gif->info.background;
  680|      0|				}
  681|      0|			}
  682|      0|		}
  683|      0|	}
  684|    173|}
gif.c:gif__clip:
  409|    259|{
  410|    259|	uint32_t frame_ext = frame_off + frame_dim;
  411|       |
  412|    259|	if (frame_ext <= image_ext) {
  ------------------
  |  Branch (412:6): [True: 259, False: 0]
  ------------------
  413|    259|		return 0;
  414|    259|	}
  415|       |
  416|      0|	return frame_ext - image_ext;
  417|    259|}
gif.c:nsgif__record_frame:
  297|     16|{
  298|     16|	size_t pixel_bytes = sizeof(*bitmap);
  299|     16|	size_t height = gif->info.height;
  300|     16|	size_t width  = gif->info.width;
  301|     16|	uint32_t *prev_frame;
  302|       |
  303|     16|	if (gif->decoded_frame == NSGIF_FRAME_INVALID ||
  ------------------
  |  |  156|     32|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
  |  Branch (303:6): [True: 0, False: 16]
  ------------------
  304|     16|	    gif->decoded_frame == gif->prev_index) {
  ------------------
  |  Branch (304:6): [True: 0, False: 16]
  ------------------
  305|       |		/* No frame to copy, or already have this frame recorded. */
  306|      0|		return;
  307|      0|	}
  308|       |
  309|     16|	bitmap = nsgif__bitmap_get(gif);
  310|     16|	if (bitmap == NULL) {
  ------------------
  |  Branch (310:6): [True: 0, False: 16]
  ------------------
  311|      0|		return;
  312|      0|	}
  313|       |
  314|     16|	if (gif->prev_frame == NULL) {
  ------------------
  |  Branch (314:6): [True: 16, False: 0]
  ------------------
  315|     16|		prev_frame = realloc(gif->prev_frame,
  316|     16|				width * height * pixel_bytes);
  317|     16|		if (prev_frame == NULL) {
  ------------------
  |  Branch (317:7): [True: 0, False: 16]
  ------------------
  318|      0|			return;
  319|      0|		}
  320|     16|	} else {
  321|      0|		prev_frame = gif->prev_frame;
  322|      0|	}
  323|       |
  324|     16|	memcpy(prev_frame, bitmap, width * height * pixel_bytes);
  325|       |
  326|     16|	gif->prev_frame  = prev_frame;
  327|     16|	gif->prev_index  = gif->decoded_frame;
  328|     16|}
gif.c:nsgif__decode:
  602|    173|{
  603|    173|	nsgif_error ret;
  604|    173|	uint32_t width  = frame->info.rect.x1 - frame->info.rect.x0;
  605|    173|	uint32_t height = frame->info.rect.y1 - frame->info.rect.y0;
  606|    173|	uint32_t offset_x = frame->info.rect.x0;
  607|    173|	uint32_t offset_y = frame->info.rect.y0;
  608|    173|	uint32_t transparency_index = frame->transparency_index;
  609|    173|	uint32_t *restrict colour_table = gif->colour_table;
  610|       |
  611|    173|	if (frame->info.interlaced == false && offset_x == 0 &&
  ------------------
  |  Branch (611:6): [True: 150, False: 23]
  |  Branch (611:41): [True: 124, False: 26]
  ------------------
  612|    173|			width == gif->info.width &&
  ------------------
  |  Branch (612:4): [True: 86, False: 38]
  ------------------
  613|    173|			width == gif->rowspan) {
  ------------------
  |  Branch (613:4): [True: 86, False: 0]
  ------------------
  614|     86|		ret = nsgif__decode_simple(gif, height, offset_y,
  615|     86|				data, transparency_index,
  616|     86|				frame_data, colour_table);
  617|     87|	} else {
  618|     87|		ret = nsgif__decode_complex(gif, width, height,
  619|     87|				offset_x, offset_y, frame->info.interlaced,
  620|     87|				data, transparency_index,
  621|     87|				frame_data, colour_table);
  622|     87|	}
  623|       |
  624|    173|	if (gif->data_complete && ret == NSGIF_ERR_END_OF_DATA) {
  ------------------
  |  Branch (624:6): [True: 173, False: 0]
  |  Branch (624:28): [True: 38, False: 135]
  ------------------
  625|       |		/* This is all the data there is, so make do. */
  626|     38|		ret = NSGIF_OK;
  627|     38|	}
  628|       |
  629|    173|	return ret;
  630|    173|}
gif.c:nsgif__decode_simple:
  546|     86|{
  547|     86|	uint32_t pixels;
  548|     86|	uint32_t written = 0;
  549|     86|	nsgif_error ret = NSGIF_OK;
  550|     86|	lzw_result res;
  551|       |
  552|     86|	if (offset_y >= gif->info.height) {
  ------------------
  |  Branch (552:6): [True: 1, False: 85]
  ------------------
  553|      1|		return NSGIF_OK;
  554|      1|	}
  555|       |
  556|     85|	height -= gif__clip(offset_y, height, gif->info.height);
  557|       |
  558|     85|	if (height == 0) {
  ------------------
  |  Branch (558:6): [True: 1, False: 84]
  ------------------
  559|      1|		return NSGIF_OK;
  560|      1|	}
  561|       |
  562|       |	/* Initialise the LZW decoding */
  563|     84|	res = lzw_decode_init_map(gif->lzw_ctx, data[0],
  564|     84|			transparency_index, colour_table,
  565|     84|			gif->buf, gif->buf_len,
  566|     84|			data + 1 - gif->buf);
  567|     84|	if (res != LZW_OK) {
  ------------------
  |  Branch (567:6): [True: 11, False: 73]
  ------------------
  568|     11|		return nsgif__error_from_lzw(res);
  569|     11|	}
  570|       |
  571|     73|	frame_data += (offset_y * gif->info.width);
  572|     73|	pixels = gif->info.width * height;
  573|       |
  574|     91|	while (pixels > 0) {
  ------------------
  |  Branch (574:9): [True: 73, False: 18]
  ------------------
  575|     73|		res = lzw_decode_map(gif->lzw_ctx,
  576|     73|				frame_data, pixels, &written);
  577|     73|		pixels -= written;
  578|     73|		frame_data += written;
  579|     73|		if (res != LZW_OK) {
  ------------------
  |  Branch (579:7): [True: 55, False: 18]
  ------------------
  580|       |			/* Unexpected end of frame, try to recover */
  581|     55|			if (res == LZW_OK_EOD || res == LZW_EOI_CODE) {
  ------------------
  |  Branch (581:8): [True: 7, False: 48]
  |  Branch (581:29): [True: 8, False: 40]
  ------------------
  582|     15|				ret = NSGIF_OK;
  583|     40|			} else {
  584|     40|				ret = nsgif__error_from_lzw(res);
  585|     40|			}
  586|     55|			break;
  587|     55|		}
  588|     73|	}
  589|       |
  590|     73|	if (pixels == 0) {
  ------------------
  |  Branch (590:6): [True: 18, False: 55]
  ------------------
  591|     18|		ret = NSGIF_OK;
  592|     18|	}
  593|       |
  594|     73|	return ret;
  595|     84|}
gif.c:nsgif__decode_complex:
  449|     87|{
  450|     87|	lzw_result res;
  451|     87|	nsgif_error ret = NSGIF_OK;
  452|     87|	uint32_t clip_x = gif__clip(offset_x, width, gif->info.width);
  453|     87|	uint32_t clip_y = gif__clip(offset_y, height, gif->info.height);
  454|     87|	const uint8_t *uncompressed;
  455|     87|	uint32_t available = 0;
  456|     87|	uint8_t step = 24;
  457|     87|	uint32_t skip = 0;
  458|     87|	uint32_t y = 0;
  459|       |
  460|     87|	if (offset_x >= gif->info.width ||
  ------------------
  |  Branch (460:6): [True: 4, False: 83]
  ------------------
  461|     87|	    offset_y >= gif->info.height) {
  ------------------
  |  Branch (461:6): [True: 4, False: 79]
  ------------------
  462|      8|		return NSGIF_OK;
  463|      8|	}
  464|       |
  465|     79|	width -= clip_x;
  466|     79|	height -= clip_y;
  467|       |
  468|     79|	if (width == 0 || height == 0) {
  ------------------
  |  Branch (468:6): [True: 7, False: 72]
  |  Branch (468:20): [True: 4, False: 68]
  ------------------
  469|     11|		return NSGIF_OK;
  470|     11|	}
  471|       |
  472|       |	/* Initialise the LZW decoding */
  473|     68|	res = lzw_decode_init(gif->lzw_ctx, data[0],
  474|     68|			gif->buf, gif->buf_len,
  475|     68|			data + 1 - gif->buf);
  476|     68|	if (res != LZW_OK) {
  ------------------
  |  Branch (476:6): [True: 6, False: 62]
  ------------------
  477|      6|		return nsgif__error_from_lzw(res);
  478|      6|	}
  479|       |
  480|  1.04k|	do {
  481|  1.04k|		uint32_t x;
  482|  1.04k|		uint32_t *frame_scanline;
  483|       |
  484|  1.04k|		frame_scanline = frame_data + offset_x +
  485|  1.04k|				(y + offset_y) * gif->rowspan;
  486|       |
  487|  1.04k|		x = width;
  488|  2.09k|		while (x > 0) {
  ------------------
  |  Branch (488:10): [True: 1.09k, False: 1.00k]
  ------------------
  489|  1.09k|			unsigned row_available;
  490|  1.16k|			while (available == 0) {
  ------------------
  |  Branch (490:11): [True: 116, False: 1.04k]
  ------------------
  491|    116|				if (res != LZW_OK) {
  ------------------
  |  Branch (491:9): [True: 45, False: 71]
  ------------------
  492|       |					/* Unexpected end of frame, try to recover */
  493|     45|					if (res == LZW_OK_EOD ||
  ------------------
  |  Branch (493:10): [True: 7, False: 38]
  ------------------
  494|     45|					    res == LZW_EOI_CODE) {
  ------------------
  |  Branch (494:10): [True: 4, False: 34]
  ------------------
  495|     11|						ret = NSGIF_OK;
  496|     34|					} else {
  497|     34|						ret = nsgif__error_from_lzw(res);
  498|     34|					}
  499|     45|					return ret;
  500|     45|				}
  501|     71|				res = lzw_decode(gif->lzw_ctx,
  502|     71|						&uncompressed, &available);
  503|       |
  504|     71|				if (available == 0) {
  ------------------
  |  Branch (504:9): [True: 0, False: 71]
  ------------------
  505|      0|					return NSGIF_OK;
  506|      0|				}
  507|     71|				gif__jump_data(&skip, &available, &uncompressed);
  508|     71|			}
  509|       |
  510|  1.04k|			row_available = x < available ? x : available;
  ------------------
  |  Branch (510:20): [True: 991, False: 56]
  ------------------
  511|  1.04k|			x -= row_available;
  512|  1.04k|			available -= row_available;
  513|  1.04k|			if (transparency_index > 0xFF) {
  ------------------
  |  Branch (513:8): [True: 442, False: 605]
  ------------------
  514|  6.55k|				while (row_available-- > 0) {
  ------------------
  |  Branch (514:12): [True: 6.11k, False: 442]
  ------------------
  515|  6.11k|					*frame_scanline++ =
  516|  6.11k|						colour_table[*uncompressed++];
  517|  6.11k|				}
  518|    605|			} else {
  519|  42.7k|				while (row_available-- > 0) {
  ------------------
  |  Branch (519:12): [True: 42.1k, False: 605]
  ------------------
  520|  42.1k|					register uint32_t colour;
  521|  42.1k|					colour = *uncompressed++;
  522|  42.1k|					if (colour != transparency_index) {
  ------------------
  |  Branch (522:10): [True: 30.6k, False: 11.4k]
  ------------------
  523|  30.6k|						*frame_scanline =
  524|  30.6k|							colour_table[colour];
  525|  30.6k|					}
  526|  42.1k|					frame_scanline++;
  527|  42.1k|				}
  528|    605|			}
  529|  1.04k|		}
  530|       |
  531|  1.00k|		skip = clip_x;
  532|  1.00k|		gif__jump_data(&skip, &available, &uncompressed);
  533|  1.00k|	} while (nsgif__next_row(interlace, height, &y, &step));
  ------------------
  |  Branch (533:11): [True: 985, False: 17]
  ------------------
  534|       |
  535|     17|	return ret;
  536|     62|}
gif.c:gif__jump_data:
  430|  1.07k|{
  431|  1.07k|	uint32_t jump = (*skip < *available) ? *skip : *available;
  ------------------
  |  Branch (431:18): [True: 1.06k, False: 11]
  ------------------
  432|       |
  433|  1.07k|	*skip -= jump;
  434|  1.07k|	*available -= jump;
  435|  1.07k|	*pos += jump;
  436|  1.07k|}
gif.c:nsgif__next_row:
  388|  1.00k|{
  389|  1.00k|	if (!interlace) {
  ------------------
  |  Branch (389:6): [True: 767, False: 235]
  ------------------
  390|    767|		return (++*y != height);
  391|    767|	} else {
  392|    235|		return nsgif__deinterlace(height, y, step);
  393|    235|	}
  394|  1.00k|}
gif.c:nsgif__deinterlace:
  358|    235|{
  359|    235|	*y += *step & 0xf;
  360|       |
  361|    235|	if (*y < height) return true;
  ------------------
  |  Branch (361:6): [True: 211, False: 24]
  ------------------
  362|       |
  363|     24|	switch (*step) {
  364|      9|	case 24: *y = 4; *step = 8; if (*y < height) return true;
  ------------------
  |  Branch (364:2): [True: 9, False: 15]
  |  Branch (364:34): [True: 8, False: 1]
  ------------------
  365|       |	         /* Fall through. */
  366|      7|	case  8: *y = 2; *step = 4; if (*y < height) return true;
  ------------------
  |  Branch (366:2): [True: 6, False: 18]
  |  Branch (366:34): [True: 6, False: 1]
  ------------------
  367|       |	         /* Fall through. */
  368|      7|	case  4: *y = 1; *step = 2; if (*y < height) return true;
  ------------------
  |  Branch (368:2): [True: 6, False: 18]
  |  Branch (368:34): [True: 6, False: 1]
  ------------------
  369|       |	         /* Fall through. */
  370|      4|	default:
  ------------------
  |  Branch (370:2): [True: 3, False: 21]
  ------------------
  371|      4|		break;
  372|     24|	}
  373|       |
  374|      4|	return false;
  375|     24|}
gif.c:nsgif__bitmap_modified:
  253|    173|{
  254|    173|	if (gif->bitmap.modified) {
  ------------------
  |  Branch (254:6): [True: 0, False: 173]
  ------------------
  255|      0|		gif->bitmap.modified(gif->frame_image);
  256|      0|	}
  257|    173|}
gif.c:nsgif__bitmap_get_opaque:
  285|    173|{
  286|    173|	if (gif->bitmap.test_opaque) {
  ------------------
  |  Branch (286:6): [True: 0, False: 173]
  ------------------
  287|      0|		return gif->bitmap.test_opaque(
  288|      0|				gif->frame_image);
  289|      0|	}
  290|       |
  291|    173|	return false;
  292|    173|}
gif.c:nsgif__bitmap_set_opaque:
  268|    173|{
  269|    173|	if (gif->bitmap.set_opaque) {
  ------------------
  |  Branch (269:6): [True: 0, False: 173]
  ------------------
  270|      0|		gif->bitmap.set_opaque(
  271|      0|				gif->frame_image, frame->opaque);
  272|      0|	}
  273|    173|}
gif.c:nsgif__colour_table_decode:
 1076|    279|{
 1077|    279|	uint8_t *entry = (uint8_t *)colour_table;
 1078|       |
 1079|  3.64k|	while (colour_table_entries--) {
  ------------------
  |  Branch (1079:9): [True: 3.36k, False: 279]
  ------------------
 1080|       |		/* Gif colour map contents are r,g,b.
 1081|       |		 *
 1082|       |		 * We want to pack them bytewise into the colour table,
 1083|       |		 * according to the client colour layout.
 1084|       |		 */
 1085|       |
 1086|  3.36k|		entry[layout->r] = *data++;
 1087|  3.36k|		entry[layout->g] = *data++;
 1088|  3.36k|		entry[layout->b] = *data++;
 1089|  3.36k|		entry[layout->a] = 0xff;
 1090|       |
 1091|  3.36k|		entry += sizeof(uint32_t);
 1092|  3.36k|	}
 1093|    279|}

lzw_context_create:
  101|    288|{
  102|    288|	struct lzw_ctx *c = malloc(sizeof(*c));
  103|    288|	if (c == NULL) {
  ------------------
  |  Branch (103:6): [True: 0, False: 288]
  ------------------
  104|      0|		return LZW_NO_MEM;
  105|      0|	}
  106|       |
  107|    288|	*ctx = c;
  108|    288|	return LZW_OK;
  109|    288|}
lzw_context_destroy:
  113|    300|{
  114|    300|	free(ctx);
  115|    300|}
lzw_decode_init:
  265|    152|{
  266|    152|	struct lzw_table_entry *table = ctx->table;
  267|    152|	lzw_result res;
  268|    152|	uint16_t code;
  269|       |
  270|    152|	if (minimum_code_size >= LZW_CODE_MAX) {
  ------------------
  |  |   21|    152|#define LZW_CODE_MAX 12
  ------------------
  |  Branch (270:6): [True: 0, False: 152]
  ------------------
  271|      0|		return LZW_BAD_ICODE;
  272|      0|	}
  273|       |
  274|       |	/* Initialise the input reading context */
  275|    152|	ctx->input.data = input_data;
  276|    152|	ctx->input.data_len = input_length;
  277|    152|	ctx->input.data_sb_next = input_pos;
  278|       |
  279|    152|	ctx->input.sb_bit = 0;
  280|    152|	ctx->input.sb_bit_count = 0;
  281|       |
  282|       |	/* Initialise the table building context */
  283|    152|	ctx->initial_code_size = minimum_code_size + 1;
  284|       |
  285|    152|	ctx->clear_code = (1 << minimum_code_size) + 0;
  286|    152|	ctx->eoi_code   = (1 << minimum_code_size) + 1;
  287|       |
  288|    152|	ctx->output_left = 0;
  289|       |
  290|       |	/* Initialise the standard table entries */
  291|  11.2k|	for (uint16_t i = 0; i < ctx->clear_code; i++) {
  ------------------
  |  Branch (291:23): [True: 11.1k, False: 152]
  ------------------
  292|  11.1k|		table[i].first = i;
  293|  11.1k|		table[i].value = i;
  294|  11.1k|		table[i].count = 1;
  295|  11.1k|	}
  296|       |
  297|    152|	res = lzw__handle_clear(ctx, &code);
  298|    152|	if (res != LZW_OK) {
  ------------------
  |  Branch (298:6): [True: 17, False: 135]
  ------------------
  299|     17|		return res;
  300|     17|	}
  301|       |
  302|       |	/* Store details of this code as "previous code" to the context. */
  303|    135|	ctx->prev_code_first = ctx->table[code].first;
  304|    135|	ctx->prev_code_count = ctx->table[code].count;
  305|    135|	ctx->prev_code = code;
  306|       |
  307|       |	/* Add code to context for immediate output. */
  308|    135|	ctx->output_code = code;
  309|    135|	ctx->output_left = 1;
  310|       |
  311|    135|	ctx->has_transparency = false;
  312|    135|	ctx->transparency_idx = 0;
  313|    135|	ctx->colour_map = NULL;
  314|       |
  315|    135|	return LZW_OK;
  316|    152|}
lzw_decode_init_map:
  327|     84|{
  328|     84|	lzw_result res;
  329|       |
  330|     84|	if (colour_table == NULL) {
  ------------------
  |  Branch (330:6): [True: 0, False: 84]
  ------------------
  331|      0|		return LZW_BAD_PARAM;
  332|      0|	}
  333|       |
  334|     84|	res = lzw_decode_init(ctx, minimum_code_size,
  335|     84|			input_data, input_length, input_pos);
  336|     84|	if (res != LZW_OK) {
  ------------------
  |  Branch (336:6): [True: 11, False: 73]
  ------------------
  337|     11|		return res;
  338|     11|	}
  339|       |
  340|     73|	ctx->has_transparency = (transparency_idx <= 0xFF);
  341|     73|	ctx->transparency_idx = transparency_idx;
  342|     73|	ctx->colour_map = colour_table;
  343|       |
  344|     73|	return LZW_OK;
  345|     84|}
lzw_decode:
  499|     71|{
  500|     71|	const uint32_t output_length = sizeof(ctx->stack_base);
  501|       |
  502|     71|	*output_written = 0;
  503|     71|	*output_data = ctx->stack_base;
  504|       |
  505|     71|	if (ctx->output_left != 0) {
  ------------------
  |  Branch (505:6): [True: 70, False: 1]
  ------------------
  506|     70|		*output_written += lzw__write_fn(ctx,
  507|     70|				ctx->stack_base, output_length, *output_written,
  508|     70|				ctx->output_code, ctx->output_left);
  509|     70|	}
  510|       |
  511|  7.55k|	while (*output_written != output_length) {
  ------------------
  |  Branch (511:9): [True: 7.54k, False: 9]
  ------------------
  512|  7.54k|		lzw_result res = lzw__decode(ctx, lzw__write_fn,
  513|  7.54k|				ctx->stack_base, output_length, output_written);
  514|  7.54k|		if (res != LZW_OK) {
  ------------------
  |  Branch (514:7): [True: 62, False: 7.48k]
  ------------------
  515|     62|			return res;
  516|     62|		}
  517|  7.54k|	}
  518|       |
  519|      9|	return LZW_OK;
  520|     71|}
lzw_decode_map:
  591|     73|{
  592|     73|	*output_written = 0;
  593|       |
  594|     73|	if (ctx->colour_map == NULL) {
  ------------------
  |  Branch (594:6): [True: 0, False: 73]
  ------------------
  595|      0|		return LZW_NO_COLOUR;
  596|      0|	}
  597|       |
  598|     73|	if (ctx->output_left != 0) {
  ------------------
  |  Branch (598:6): [True: 73, False: 0]
  ------------------
  599|     73|		*output_written += lzw__map_write_fn(ctx,
  600|     73|				output_data, output_length, *output_written,
  601|     73|				ctx->output_code, ctx->output_left);
  602|     73|	}
  603|       |
  604|  6.55k|	while (*output_written != output_length) {
  ------------------
  |  Branch (604:9): [True: 6.53k, False: 18]
  ------------------
  605|  6.53k|		lzw_result res = lzw__decode(ctx, lzw__map_write_fn,
  606|  6.53k|				output_data, output_length, output_written);
  607|  6.53k|		if (res != LZW_OK) {
  ------------------
  |  Branch (607:7): [True: 55, False: 6.48k]
  ------------------
  608|     55|			return res;
  609|     55|		}
  610|  6.53k|	}
  611|       |
  612|     18|	return LZW_OK;
  613|     73|}
lzw.c:lzw__handle_clear:
  232|  1.98k|{
  233|  1.98k|	uint16_t code;
  234|       |
  235|       |	/* Reset table building context */
  236|  1.98k|	ctx->code_size = ctx->initial_code_size;
  237|  1.98k|	ctx->code_max = (1 << ctx->initial_code_size) - 1;
  238|  1.98k|	ctx->table_size = ctx->eoi_code + 1;
  239|       |
  240|       |	/* There might be a sequence of clear codes, so process them all */
  241|  4.60k|	do {
  242|  4.60k|		lzw_result res = lzw__read_code(&ctx->input,
  243|  4.60k|				ctx->code_size, &code);
  244|  4.60k|		if (res != LZW_OK) {
  ------------------
  |  Branch (244:7): [True: 24, False: 4.57k]
  ------------------
  245|     24|			return res;
  246|     24|		}
  247|  4.60k|	} while (code == ctx->clear_code);
  ------------------
  |  Branch (247:11): [True: 2.61k, False: 1.96k]
  ------------------
  248|       |
  249|       |	/* The initial code must be from the initial table. */
  250|  1.96k|	if (code > ctx->clear_code) {
  ------------------
  |  Branch (250:6): [True: 6, False: 1.95k]
  ------------------
  251|      6|		return LZW_BAD_ICODE;
  252|      6|	}
  253|       |
  254|  1.95k|	*code_out = code;
  255|  1.95k|	return LZW_OK;
  256|  1.96k|}
lzw.c:lzw__read_code:
  167|  18.6k|{
  168|  18.6k|	uint32_t code = 0;
  169|  18.6k|	uint32_t current_bit = ctx->sb_bit & 0x7;
  170|       |
  171|  18.6k|	if (ctx->sb_bit + 24 <= ctx->sb_bit_count) {
  ------------------
  |  Branch (171:6): [True: 16.7k, False: 1.91k]
  ------------------
  172|       |		/* Fast path: read three bytes from this sub-block */
  173|  16.7k|		const uint8_t *data = ctx->sb_data + (ctx->sb_bit >> 3);
  174|  16.7k|		code |= *data++ <<  0;
  175|  16.7k|		code |= *data++ <<  8;
  176|  16.7k|		code |= *data   << 16;
  177|  16.7k|		ctx->sb_bit += code_size;
  178|  16.7k|	} else {
  179|       |		/* Slow path: code spans sub-blocks */
  180|  1.91k|		uint8_t byte_advance = (current_bit + code_size) >> 3;
  181|  1.91k|		uint8_t byte = 0;
  182|  1.91k|		uint8_t bits_remaining_0 = (code_size < (8u - current_bit)) ?
  ------------------
  |  Branch (182:30): [True: 1.54k, False: 371]
  ------------------
  183|  1.54k|				code_size : (8u - current_bit);
  184|  1.91k|		uint8_t bits_remaining_1 = code_size - bits_remaining_0;
  185|  1.91k|		uint8_t bits_used[3] = {
  186|  1.91k|			[0] = bits_remaining_0,
  187|  1.91k|			[1] = bits_remaining_1 < 8 ? bits_remaining_1 : 8,
  ------------------
  |  Branch (187:10): [True: 1.91k, False: 2]
  ------------------
  188|  1.91k|			[2] = bits_remaining_1 - 8,
  189|  1.91k|		};
  190|       |
  191|  1.91k|		assert(byte_advance <= 2);
  192|       |
  193|  2.19k|		while (true) {
  194|  2.19k|			const uint8_t *data = ctx->sb_data;
  195|  2.19k|			lzw_result res;
  196|       |
  197|       |			/* Get any data from end of this sub-block */
  198|  4.42k|			while (byte <= byte_advance &&
  ------------------
  |  Branch (198:11): [True: 2.56k, False: 1.85k]
  ------------------
  199|  4.42k|					ctx->sb_bit < ctx->sb_bit_count) {
  ------------------
  |  Branch (199:6): [True: 2.23k, False: 335]
  ------------------
  200|  2.23k|				code |= data[ctx->sb_bit >> 3] << (byte << 3);
  201|  2.23k|				ctx->sb_bit += bits_used[byte];
  202|  2.23k|				byte++;
  203|  2.23k|			}
  204|       |
  205|       |			/* Check if we have all we need */
  206|  2.19k|			if (byte > byte_advance) {
  ------------------
  |  Branch (206:8): [True: 1.85k, False: 335]
  ------------------
  207|  1.85k|				break;
  208|  1.85k|			}
  209|       |
  210|       |			/* Move to next sub-block */
  211|    335|			res = lzw__block_advance(ctx);
  212|    335|			if (res != LZW_OK) {
  ------------------
  |  Branch (212:8): [True: 54, False: 281]
  ------------------
  213|     54|				return res;
  214|     54|			}
  215|    335|		}
  216|  1.91k|	}
  217|       |
  218|  18.6k|	*code_out = (code >> current_bit) & ((1 << code_size) - 1);
  219|  18.6k|	return LZW_OK;
  220|  18.6k|}
lzw.c:lzw__block_advance:
  124|    335|{
  125|    335|	size_t block_size;
  126|    335|	size_t next_block_pos = ctx->data_sb_next;
  127|    335|	const uint8_t *data_next = ctx->data + next_block_pos;
  128|       |
  129|    335|	if (next_block_pos >= ctx->data_len) {
  ------------------
  |  Branch (129:6): [True: 4, False: 331]
  ------------------
  130|      4|		return LZW_NO_DATA;
  131|      4|	}
  132|       |
  133|    331|	block_size = *data_next;
  134|       |
  135|    331|	if ((next_block_pos + block_size) >= ctx->data_len) {
  ------------------
  |  Branch (135:6): [True: 31, False: 300]
  ------------------
  136|     31|		return LZW_NO_DATA;
  137|     31|	}
  138|       |
  139|    300|	ctx->sb_bit = 0;
  140|    300|	ctx->sb_bit_count = block_size * 8;
  141|       |
  142|    300|	if (block_size == 0) {
  ------------------
  |  Branch (142:6): [True: 19, False: 281]
  ------------------
  143|     19|		ctx->data_sb_next += 1;
  144|     19|		return LZW_OK_EOD;
  145|     19|	}
  146|       |
  147|    281|	ctx->sb_data = data_next + 1;
  148|    281|	ctx->data_sb_next += block_size + 1;
  149|       |
  150|    281|	return LZW_OK;
  151|    300|}
lzw.c:lzw__write_fn:
  463|  7.55k|{
  464|  7.55k|	uint8_t *restrict output_pos = (uint8_t *)output_data + output_used;
  465|  7.55k|	const struct lzw_table_entry * const table = ctx->table;
  466|  7.55k|	uint32_t space = output_length - output_used;
  467|  7.55k|	uint16_t count = left;
  468|       |
  469|  7.55k|	if (count > space) {
  ------------------
  |  Branch (469:6): [True: 8, False: 7.54k]
  ------------------
  470|      8|		left = count - space;
  471|      8|		count = space;
  472|  7.54k|	} else {
  473|  7.54k|		left = 0;
  474|  7.54k|	}
  475|       |
  476|  7.55k|	ctx->output_code = code;
  477|  7.55k|	ctx->output_left = left;
  478|       |
  479|       |	/* Skip over any values we don't have space for. */
  480|  7.68k|	for (unsigned i = left; i != 0; i--) {
  ------------------
  |  Branch (480:26): [True: 129, False: 7.55k]
  ------------------
  481|    129|		const struct lzw_table_entry *entry = table + code;
  482|    129|		code = entry->extends;
  483|    129|	}
  484|       |
  485|  7.55k|	output_pos += count;
  486|  61.5k|	for (unsigned i = count; i != 0; i--) {
  ------------------
  |  Branch (486:27): [True: 54.0k, False: 7.55k]
  ------------------
  487|  54.0k|		const struct lzw_table_entry *entry = table + code;
  488|  54.0k|		*--output_pos = entry->value;
  489|  54.0k|		code = entry->extends;
  490|  54.0k|	}
  491|       |
  492|  7.55k|	return count;
  493|  7.55k|}
lzw.c:lzw__decode:
  391|  14.0k|{
  392|  14.0k|	lzw_result res;
  393|  14.0k|	uint16_t code;
  394|       |
  395|       |	/* Get a new code from the input */
  396|  14.0k|	res = lzw__read_code(&ctx->input, ctx->code_size, &code);
  397|  14.0k|	if (res != LZW_OK) {
  ------------------
  |  Branch (397:6): [True: 30, False: 14.0k]
  ------------------
  398|     30|		return res;
  399|     30|	}
  400|       |
  401|       |	/* Handle the new code */
  402|  14.0k|	if (code == ctx->eoi_code) {
  ------------------
  |  Branch (402:6): [True: 19, False: 14.0k]
  ------------------
  403|       |		/* Got End of Information code */
  404|     19|		return LZW_EOI_CODE;
  405|       |
  406|  14.0k|	} else if (code > ctx->table_size) {
  ------------------
  |  Branch (406:13): [True: 55, False: 13.9k]
  ------------------
  407|       |		/* Code is invalid */
  408|     55|		return LZW_BAD_CODE;
  409|       |
  410|  13.9k|	} else if (code == ctx->clear_code) {
  ------------------
  |  Branch (410:13): [True: 1.83k, False: 12.1k]
  ------------------
  411|  1.83k|		res = lzw__handle_clear(ctx, &code);
  412|  1.83k|		if (res != LZW_OK) {
  ------------------
  |  Branch (412:7): [True: 13, False: 1.82k]
  ------------------
  413|     13|			return res;
  414|     13|		}
  415|       |
  416|  12.1k|	} else if (ctx->table_size < LZW_TABLE_ENTRY_MAX) {
  ------------------
  |  |   25|  12.1k|#define LZW_TABLE_ENTRY_MAX (1u << LZW_CODE_MAX)
  |  |  ------------------
  |  |  |  |   21|  12.1k|#define LZW_CODE_MAX 12
  |  |  ------------------
  ------------------
  |  Branch (416:13): [True: 12.1k, False: 0]
  ------------------
  417|  12.1k|		uint16_t size = ctx->table_size;
  418|  12.1k|		lzw__table_add_entry(ctx, (code < size) ?
  ------------------
  |  Branch (418:29): [True: 11.0k, False: 1.08k]
  ------------------
  419|  11.0k|				ctx->table[code].first :
  420|  12.1k|				ctx->prev_code_first);
  421|       |
  422|       |		/* Ensure code size is increased, if needed. */
  423|  12.1k|		if (size == ctx->code_max && ctx->code_size < LZW_CODE_MAX) {
  ------------------
  |  |   21|    312|#define LZW_CODE_MAX 12
  ------------------
  |  Branch (423:7): [True: 312, False: 11.8k]
  |  Branch (423:32): [True: 312, False: 0]
  ------------------
  424|    312|			ctx->code_size++;
  425|    312|			ctx->code_max = (1 << ctx->code_size) - 1;
  426|    312|		}
  427|  12.1k|	}
  428|       |
  429|  13.9k|	*output_written += write_fn(ctx,
  430|  13.9k|			output_data, output_length, *output_written,
  431|  13.9k|			code, ctx->table[code].count);
  432|       |
  433|       |	/* Store details of this code as "previous code" to the context. */
  434|  13.9k|	ctx->prev_code_first = ctx->table[code].first;
  435|  13.9k|	ctx->prev_code_count = ctx->table[code].count;
  436|  13.9k|	ctx->prev_code = code;
  437|       |
  438|  13.9k|	return LZW_OK;
  439|  14.0k|}
lzw.c:lzw__table_add_entry:
  356|  12.1k|{
  357|  12.1k|	struct lzw_table_entry *entry = &ctx->table[ctx->table_size];
  358|       |
  359|  12.1k|	entry->value = code;
  360|  12.1k|	entry->first = ctx->prev_code_first;
  361|  12.1k|	entry->count = ctx->prev_code_count + 1;
  362|  12.1k|	entry->extends = ctx->prev_code;
  363|       |
  364|  12.1k|	ctx->table_size++;
  365|  12.1k|}
lzw.c:lzw__map_write_fn:
  544|  6.55k|{
  545|  6.55k|	uint32_t *restrict output_pos = (uint32_t *)output_data + output_used;
  546|  6.55k|	const struct lzw_table_entry * const table = ctx->table;
  547|  6.55k|	uint32_t space = output_length - output_used;
  548|  6.55k|	uint16_t count = left;
  549|       |
  550|  6.55k|	if (count > space) {
  ------------------
  |  Branch (550:6): [True: 9, False: 6.54k]
  ------------------
  551|      9|		left = count - space;
  552|      9|		count = space;
  553|  6.54k|	} else {
  554|  6.54k|		left = 0;
  555|  6.54k|	}
  556|       |
  557|  6.55k|	ctx->output_code = code;
  558|  6.55k|	ctx->output_left = left;
  559|       |
  560|  6.61k|	for (unsigned i = left; i != 0; i--) {
  ------------------
  |  Branch (560:26): [True: 54, False: 6.55k]
  ------------------
  561|     54|		const struct lzw_table_entry *entry = table + code;
  562|     54|		code = entry->extends;
  563|     54|	}
  564|       |
  565|  6.55k|	output_pos += count;
  566|  6.55k|	if (ctx->has_transparency) {
  ------------------
  |  Branch (566:6): [True: 1.93k, False: 4.61k]
  ------------------
  567|  29.0k|		for (unsigned i = count; i != 0; i--) {
  ------------------
  |  Branch (567:28): [True: 27.1k, False: 1.93k]
  ------------------
  568|  27.1k|			const struct lzw_table_entry *entry = table + code;
  569|  27.1k|			--output_pos;
  570|  27.1k|			if (entry->value != ctx->transparency_idx) {
  ------------------
  |  Branch (570:8): [True: 19.5k, False: 7.55k]
  ------------------
  571|  19.5k|				*output_pos = ctx->colour_map[entry->value];
  572|  19.5k|			}
  573|  27.1k|			code = entry->extends;
  574|  27.1k|		}
  575|  4.61k|	} else {
  576|  19.1k|		for (unsigned i = count; i != 0; i--) {
  ------------------
  |  Branch (576:28): [True: 14.5k, False: 4.61k]
  ------------------
  577|  14.5k|			const struct lzw_table_entry *entry = table + code;
  578|  14.5k|			*--output_pos = ctx->colour_map[entry->value];
  579|  14.5k|			code = entry->extends;
  580|  14.5k|		}
  581|  4.61k|	}
  582|       |
  583|  6.55k|	return count;
  584|  6.55k|}

matrixload.c:vips_foreign_load_matrix_class_init:
  265|      1|{
  266|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  268|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  269|       |
  270|      1|	gobject_class->dispose = vips_foreign_load_matrix_dispose;
  271|       |
  272|      1|	object_class->nickname = "matrixload_base";
  273|      1|	object_class->description = _("load matrix");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  274|      1|	object_class->build = vips_foreign_load_matrix_build;
  275|       |
  276|      1|	load_class->get_flags = vips_foreign_load_matrix_get_flags;
  277|      1|	load_class->header = vips_foreign_load_matrix_header;
  278|      1|	load_class->load = vips_foreign_load_matrix_load;
  279|      1|}
matrixload.c:vips_foreign_load_matrix_file_class_init:
  355|      1|{
  356|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  357|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  358|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  359|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  360|       |
  361|      1|	gobject_class->set_property = vips_object_set_property;
  362|      1|	gobject_class->get_property = vips_object_get_property;
  363|       |
  364|      1|	object_class->nickname = "matrixload";
  365|      1|	object_class->build = vips_foreign_load_matrix_file_build;
  366|       |
  367|      1|	foreign_class->suffs = vips_foreign_load_matrix_suffs;
  368|       |
  369|      1|	load_class->is_a = vips_foreign_load_matrix_file_is_a;
  370|      1|	load_class->get_flags_filename =
  371|      1|		vips_foreign_load_matrix_file_get_flags_filename;
  372|       |
  373|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  374|      1|		_("Filename"),
  375|      1|		_("Filename to load from"),
  376|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  377|      1|		G_STRUCT_OFFSET(VipsForeignLoadMatrixFile, filename),
  378|      1|		NULL);
  379|      1|}
matrixload.c:vips_foreign_load_matrix_source_class_init:
  445|      1|{
  446|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  447|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  448|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  449|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  450|       |
  451|      1|	gobject_class->set_property = vips_object_set_property;
  452|      1|	gobject_class->get_property = vips_object_get_property;
  453|       |
  454|      1|	object_class->nickname = "matrixload_source";
  455|      1|	object_class->build = vips_foreign_load_matrix_source_build;
  456|       |
  457|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  458|       |
  459|      1|	load_class->is_a_source = vips_foreign_load_matrix_source_is_a_source;
  460|       |
  461|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  462|      1|		_("Source"),
  463|      1|		_("Source to load from"),
  464|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  465|      1|		G_STRUCT_OFFSET(VipsForeignLoadMatrixSource, source),
  466|      1|		VIPS_TYPE_SOURCE);
  467|      1|}

matrixsave.c:vips_foreign_save_matrix_class_init:
  166|      1|{
  167|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  169|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  170|      1|	VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
  171|       |
  172|      1|	gobject_class->dispose = vips_foreign_save_matrix_dispose;
  173|       |
  174|      1|	object_class->nickname = "matrixsave_base";
  175|      1|	object_class->description = _("save image to matrix");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  176|      1|	object_class->build = vips_foreign_save_matrix_build;
  177|       |
  178|      1|	foreign_class->suffs = vips_foreign_save_matrix_suffs;
  179|       |
  180|      1|	save_class->saveable = VIPS_SAVEABLE_MONO;
  181|      1|	save_class->format_table = bandfmt_matrix;
  182|      1|}
matrixsave.c:vips_foreign_save_matrix_file_class_init:
  217|      1|{
  218|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  219|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  220|       |
  221|      1|	gobject_class->set_property = vips_object_set_property;
  222|      1|	gobject_class->get_property = vips_object_get_property;
  223|       |
  224|      1|	object_class->nickname = "matrixsave";
  225|      1|	object_class->build = vips_foreign_save_matrix_file_build;
  226|       |
  227|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  228|      1|		_("Filename"),
  229|      1|		_("Filename to save to"),
  230|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  231|      1|		G_STRUCT_OFFSET(VipsForeignSaveMatrixFile, filename),
  232|      1|		NULL);
  233|      1|}
matrixsave.c:vips_foreign_save_matrix_target_class_init:
  270|      1|{
  271|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  272|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  273|       |
  274|      1|	gobject_class->set_property = vips_object_set_property;
  275|      1|	gobject_class->get_property = vips_object_get_property;
  276|       |
  277|      1|	object_class->nickname = "matrixsave_target";
  278|      1|	object_class->build = vips_foreign_save_matrix_target_build;
  279|       |
  280|      1|	VIPS_ARG_OBJECT(class, "target", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  281|      1|		_("Target"),
  282|      1|		_("Target to save to"),
  283|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  284|      1|		G_STRUCT_OFFSET(VipsForeignSaveMatrixTarget, target),
  285|      1|		VIPS_TYPE_TARGET);
  286|      1|}
matrixsave.c:vips_foreign_print_matrix_class_init:
  319|      1|{
  320|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  321|       |
  322|      1|	object_class->nickname = "matrixprint";
  323|      1|	object_class->description = _("print matrix");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  324|      1|	object_class->build = vips_foreign_print_matrix_build;
  325|      1|}

vips_foreign_load_nsgif_tile_height:
  543|    173|{
  544|    173|	int height = gif->info->height;
  545|       |
  546|    173|	int i;
  547|       |
  548|       |	/* First, check the perfect size.
  549|       |	 */
  550|    173|	if (height % 16 == 0)
  ------------------
  |  Branch (550:6): [True: 98, False: 75]
  ------------------
  551|     98|		return 16;
  552|       |
  553|       |	/* Next, check larger and smaller sizes.
  554|       |	 */
  555|    621|	for (i = 1; i < 16; i++) {
  ------------------
  |  Branch (555:14): [True: 621, False: 0]
  ------------------
  556|    621|		if (height % (16 + i) == 0)
  ------------------
  |  Branch (556:7): [True: 22, False: 599]
  ------------------
  557|     22|			return 16 + i;
  558|    599|		if (height % (16 - i) == 0)
  ------------------
  |  Branch (558:7): [True: 53, False: 546]
  ------------------
  559|     53|			return 16 - i;
  560|    599|	}
  561|       |
  562|      0|	return 1;
  563|     75|}
nsgifload.c:vips_foreign_load_nsgif_class_init:
  596|      1|{
  597|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  598|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  599|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  600|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  601|       |
  602|      1|	gobject_class->dispose = vips_foreign_load_nsgif_dispose;
  603|      1|	gobject_class->set_property = vips_object_set_property;
  604|      1|	gobject_class->get_property = vips_object_get_property;
  605|       |
  606|      1|	object_class->nickname = "gifload_base";
  607|      1|	object_class->description = _("load GIF with libnsgif");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  608|       |
  609|       |	/* High priority, so that we handle vipsheader etc.
  610|       |	 */
  611|      1|	foreign_class->priority = 50;
  612|       |
  613|      1|	load_class->get_flags_filename =
  614|      1|		vips_foreign_load_nsgif_get_flags_filename;
  615|      1|	load_class->get_flags = vips_foreign_load_nsgif_get_flags;
  616|      1|	load_class->header = vips_foreign_load_nsgif_header;
  617|      1|	load_class->load = vips_foreign_load_nsgif_load;
  618|       |
  619|      1|	VIPS_ARG_INT(class, "page", 10,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  620|      1|		_("Page"),
  621|      1|		_("First page to load"),
  622|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  623|      1|		G_STRUCT_OFFSET(VipsForeignLoadNsgif, page),
  624|      1|		0, 100000, 0);
  625|       |
  626|      1|	VIPS_ARG_INT(class, "n", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  627|      1|		_("n"),
  628|      1|		_("Number of pages to load, -1 for all"),
  629|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  630|      1|		G_STRUCT_OFFSET(VipsForeignLoadNsgif, n),
  631|      1|		-1, 100000, 1);
  632|      1|}
nsgifload.c:vips_foreign_load_nsgif_dispose:
  172|    300|{
  173|    300|	VipsForeignLoadNsgif *gif = (VipsForeignLoadNsgif *) gobject;
  174|       |
  175|    300|	VIPS_DEBUG_MSG("vips_foreign_load_nsgif_dispose:\n");
  ------------------
  |  |   47|    300|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    300|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    300|	{ \
  |  |   49|    300|		; \
  |  |   50|    300|	} \
  |  |   51|    300|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    300|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  176|       |
  177|    300|	VIPS_FREEF(nsgif_destroy, gif->anim);
  ------------------
  |  |   41|    300|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    300|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|    300|	{ \
  |  |   43|    300|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 300, False: 0]
  |  |  ------------------
  |  |   44|    300|			(void) F((S)); \
  |  |   45|    300|			(S) = 0; \
  |  |   46|    300|		} \
  |  |   47|    300|	} \
  |  |   48|    300|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    300|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  178|    300|	VIPS_UNREF(gif->source);
  ------------------
  |  |   57|    300|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|    300|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    300|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    300|	{ \
  |  |  |  |   43|    300|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 300, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|    300|			(void) F((S)); \
  |  |  |  |   45|    300|			(S) = 0; \
  |  |  |  |   46|    300|		} \
  |  |  |  |   47|    300|	} \
  |  |  |  |   48|    300|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    300|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  179|    300|	VIPS_FREE(gif->delay);
  ------------------
  |  |   50|    300|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|    300|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    300|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    300|	{ \
  |  |  |  |   43|    300|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 192, False: 108]
  |  |  |  |  ------------------
  |  |  |  |   44|    192|			(void) F((S)); \
  |  |  |  |   45|    192|			(S) = 0; \
  |  |  |  |   46|    192|		} \
  |  |  |  |   47|    300|	} \
  |  |  |  |   48|    300|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    300|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|       |
  181|    300|	G_OBJECT_CLASS(vips_foreign_load_nsgif_parent_class)->dispose(gobject);
  ------------------
  |  |   58|    300|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|    300|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    300|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  182|    300|}
nsgifload.c:vips_foreign_load_nsgif_get_flags:
  192|    300|{
  193|    300|	return VIPS_FOREIGN_SEQUENTIAL;
  194|    300|}
nsgifload.c:vips_foreign_load_nsgif_header:
  365|    300|{
  366|    300|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(load);
  ------------------
  |  |  441|    300|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    300|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    300|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  367|    300|	VipsForeignLoadNsgif *gif = (VipsForeignLoadNsgif *) load;
  368|       |
  369|    300|	const void *data;
  370|    300|	size_t size;
  371|    300|	nsgif_error result;
  372|    300|	int i;
  373|       |
  374|    300|	VIPS_DEBUG_MSG("vips_foreign_load_nsgif_header:\n");
  ------------------
  |  |   47|    300|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    300|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    300|	{ \
  |  |   49|    300|		; \
  |  |   50|    300|	} \
  |  |   51|    300|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    300|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  375|       |
  376|       |	/* Map the whole source into memory.
  377|       |	 */
  378|    300|	if (!(data = vips_source_map(gif->source, &size)))
  ------------------
  |  Branch (378:6): [True: 0, False: 300]
  ------------------
  379|      0|		return -1;
  380|       |
  381|       |	/* Treat errors from _scan() as warnings. If libnsgif really can't do
  382|       |	 * something it'll fail gracefully later when we try to read out
  383|       |	 * frame data.
  384|       |	 */
  385|    300|	result = nsgif_data_scan(gif->anim, size, (void *) data);
  386|    300|	VIPS_DEBUG_MSG("nsgif_data_scan() = %s\n", nsgif_strerror(result));
  ------------------
  |  |   47|    300|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    300|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    300|	{ \
  |  |   49|    300|		; \
  |  |   50|    300|	} \
  |  |   51|    300|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    300|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  387|    300|	switch (result) {
  388|    175|	case NSGIF_ERR_END_OF_DATA:
  ------------------
  |  Branch (388:2): [True: 175, False: 125]
  ------------------
  389|    175|		if (load->fail_on >= VIPS_FAIL_ON_TRUNCATED) {
  ------------------
  |  Branch (389:7): [True: 0, False: 175]
  ------------------
  390|      0|			vips_foreign_load_nsgif_error(gif, result);
  391|      0|			return -1;
  392|      0|		}
  393|    175|		else
  394|    175|			g_warning("%s", nsgif_strerror(result));
  ------------------
  |  |  338|    175|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|    175|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|    175|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|    175|                               __VA_ARGS__)
  ------------------
  395|    175|		break;
  396|       |
  397|    175|	case NSGIF_OK:
  ------------------
  |  Branch (397:2): [True: 68, False: 232]
  ------------------
  398|     68|		break;
  399|       |
  400|     57|	default:
  ------------------
  |  Branch (400:2): [True: 57, False: 243]
  ------------------
  401|     57|		if (load->fail_on >= VIPS_FAIL_ON_WARNING) {
  ------------------
  |  Branch (401:7): [True: 0, False: 57]
  ------------------
  402|      0|			vips_foreign_load_nsgif_error(gif, result);
  403|      0|			return -1;
  404|      0|		}
  405|     57|		else
  406|     57|			g_warning("%s", nsgif_strerror(result));
  ------------------
  |  |  338|     57|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|     57|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|     57|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|     57|                               __VA_ARGS__)
  ------------------
  407|     57|		break;
  408|    300|	}
  409|       |
  410|       |	/* Tell libnsgif that that's all the data we have. This will let us
  411|       |	 * read out any truncated final frames.
  412|       |	 */
  413|    300|	nsgif_data_complete(gif->anim);
  414|       |
  415|    300|	gif->info = nsgif_get_info(gif->anim);
  416|       |#ifdef VERBOSE
  417|       |	print_animation(gif->anim, gif->info);
  418|       |#endif /*VERBOSE*/
  419|    300|	if (!gif->info->frame_count) {
  ------------------
  |  Branch (419:6): [True: 108, False: 192]
  ------------------
  420|    108|		vips_error(class->nickname, "%s", _("no frames in GIF"));
  ------------------
  |  |   30|    108|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    108|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  421|    108|		return -1;
  422|    108|	}
  423|       |
  424|       |	/* Update our global struct based on the information in the
  425|       |	 * individual frames.
  426|       |	 */
  427|    467|	for (i = 0; i < gif->info->frame_count; i++) {
  ------------------
  |  Branch (427:14): [True: 275, False: 192]
  ------------------
  428|    275|		const nsgif_frame_info_t *frame_info;
  429|       |
  430|    275|		if ((frame_info = nsgif_get_frame_info(gif->anim, i))) {
  ------------------
  |  Branch (430:7): [True: 275, False: 0]
  ------------------
  431|    275|			if (frame_info->transparency)
  ------------------
  |  Branch (431:8): [True: 151, False: 124]
  ------------------
  432|    151|				gif->has_transparency = TRUE;
  ------------------
  |  |  798|    151|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    151|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  433|    275|			if (frame_info->interlaced)
  ------------------
  |  Branch (433:8): [True: 57, False: 218]
  ------------------
  434|     57|				gif->interlaced = TRUE;
  ------------------
  |  |  798|     57|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|     57|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  435|    275|			if (frame_info->local_palette)
  ------------------
  |  Branch (435:8): [True: 47, False: 228]
  ------------------
  436|     47|				gif->local_palette = TRUE;
  ------------------
  |  |  798|     47|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|     47|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  437|    275|		}
  438|    275|	}
  439|       |
  440|    192|	if (gif->n == -1)
  ------------------
  |  Branch (440:6): [True: 0, False: 192]
  ------------------
  441|      0|		gif->gif_n = gif->info->frame_count - gif->page;
  442|    192|	else
  443|    192|		gif->gif_n = gif->n;
  444|       |
  445|    192|	if (gif->page < 0 ||
  ------------------
  |  Branch (445:6): [True: 0, False: 192]
  ------------------
  446|    192|		gif->gif_n <= 0 ||
  ------------------
  |  Branch (446:3): [True: 0, False: 192]
  ------------------
  447|    192|		gif->page + gif->gif_n > gif->info->frame_count) {
  ------------------
  |  Branch (447:3): [True: 0, False: 192]
  ------------------
  448|      0|		vips_error(class->nickname, "%s", _("bad page number"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  449|      0|		return -1;
  450|      0|	}
  451|       |
  452|       |	/* In ms, frame_delay in cs.
  453|       |	 */
  454|    192|	VIPS_FREE(gif->delay);
  ------------------
  |  |   50|    192|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|    192|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    192|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    192|	{ \
  |  |  |  |   43|    192|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 192]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|    192|	} \
  |  |  |  |   48|    192|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    192|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  455|    192|	if (!(gif->delay = VIPS_ARRAY(NULL,
  ------------------
  |  |   72|    192|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    192|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    192|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    192|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    192|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (455:6): [True: 0, False: 192]
  ------------------
  456|    192|			  gif->info->frame_count, int)))
  457|      0|		return -1;
  458|    467|	for (i = 0; i < gif->info->frame_count; i++) {
  ------------------
  |  Branch (458:14): [True: 275, False: 192]
  ------------------
  459|    275|		const nsgif_frame_info_t *frame_info;
  460|       |
  461|    275|		frame_info = nsgif_get_frame_info(gif->anim, i);
  462|    275|		if (frame_info == NULL) {
  ------------------
  |  Branch (462:7): [True: 0, False: 275]
  ------------------
  463|      0|			vips_error(class->nickname, "%s", _("bad frame"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  464|      0|			return -1;
  465|      0|		}
  466|    275|		gif->delay[i] = 10 * frame_info->delay;
  467|    275|	}
  468|       |
  469|    192|	gif->gif_delay = gif->delay[0] / 10;
  470|       |
  471|    192|	vips_foreign_load_nsgif_set_header(gif, load->out);
  472|       |
  473|    192|	return 0;
  474|    192|}
nsgifload.c:vips_foreign_load_nsgif_error:
  164|     53|{
  165|     53|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(gif);
  ------------------
  |  |  441|     53|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|     53|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|     53|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  166|       |
  167|     53|	vips_error(class->nickname, "%s", nsgif_strerror(result));
  168|     53|}
nsgifload.c:vips_foreign_load_nsgif_set_header:
  260|    365|{
  261|    365|	double array[3];
  262|    365|	const uint8_t *bg;
  263|    365|	size_t entries;
  264|    365|	uint32_t table[NSGIF_MAX_COLOURS];
  265|    365|	int colours;
  266|       |
  267|    365|	VIPS_DEBUG_MSG("vips_foreign_load_nsgif_set_header:\n");
  ------------------
  |  |   47|    365|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    365|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    365|	{ \
  |  |   49|    365|		; \
  |  |   50|    365|	} \
  |  |   51|    365|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    365|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  268|       |
  269|    365|	vips_image_init_fields(image,
  270|    365|		gif->info->width, gif->info->height * gif->gif_n,
  271|    365|		gif->has_transparency ? 4 : 3,
  ------------------
  |  Branch (271:3): [True: 242, False: 123]
  ------------------
  272|    365|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  273|    365|		VIPS_INTERPRETATION_sRGB, 1.0, 1.0);
  274|    365|	vips_image_pipelinev(image, VIPS_DEMAND_STYLE_FATSTRIP, NULL);
  275|       |
  276|       |	/* Only set page-height if we have more than one page, or this could
  277|       |	 * accidentally turn into an animated image later.
  278|       |	 */
  279|    365|	if (gif->gif_n > 1)
  ------------------
  |  Branch (279:6): [True: 0, False: 365]
  ------------------
  280|      0|		vips_image_set_int(image, VIPS_META_PAGE_HEIGHT, gif->info->height);
  ------------------
  |  |  158|      0|#define VIPS_META_PAGE_HEIGHT "page-height"
  ------------------
  281|    365|	vips_image_set_int(image, VIPS_META_N_PAGES,
  ------------------
  |  |  165|    365|#define VIPS_META_N_PAGES "n-pages"
  ------------------
  282|    365|		gif->info->frame_count);
  283|    365|	vips_image_set_int(image, "loop", gif->info->loop_max);
  284|       |
  285|    365|	vips_image_set_array_int(image, "delay",
  286|    365|		gif->delay, gif->info->frame_count);
  287|       |
  288|    365|	bg = (uint8_t *) &gif->info->background;
  289|    365|	array[0] = bg[0];
  290|    365|	array[1] = bg[1];
  291|    365|	array[2] = bg[2];
  292|       |
  293|    365|	vips_image_set_array_double(image, "background", array, 3);
  294|       |
  295|    365|	VIPS_SETSTR(image->filename,
  ------------------
  |  |   53|    365|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    365|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|    365|	{ \
  |  |   55|    365|		const char *sst = (V); \
  |  |   56|    365|		\
  |  |   57|    365|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 365, False: 0]
  |  |  ------------------
  |  |   58|    365|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 365]
  |  |  |  Branch (58:16): [True: 365, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|    365|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|    365|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|    365|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|    365|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|    365|	{ \
  |  |  |  |  |  |   43|    365|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 365, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|    365|			(void) F((S)); \
  |  |  |  |  |  |   45|    365|			(S) = 0; \
  |  |  |  |  |  |   46|    365|		} \
  |  |  |  |  |  |   47|    365|	} \
  |  |  |  |  |  |   48|    365|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|    365|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|    365|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 365]
  |  |  ------------------
  |  |   61|    365|					(S) = g_strdup(sst); \
  |  |   62|    365|			} \
  |  |   63|    365|		} \
  |  |   64|    365|	} \
  |  |   65|    365|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    365|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  296|    365|		vips_connection_filename(VIPS_CONNECTION(gif->source)));
  297|       |
  298|       |	/* DEPRECATED "gif-loop"
  299|       |	 *
  300|       |	 * Not the correct behavior as loop=1 became gif-loop=0
  301|       |	 * but we want to keep the old behavior untouched!
  302|       |	 */
  303|    365|	vips_image_set_int(image, "gif-loop",
  304|    365|		gif->info->loop_max == 0
  ------------------
  |  Branch (304:3): [True: 1, False: 364]
  ------------------
  305|    365|			? 0
  306|    365|			: gif->info->loop_max - 1);
  307|       |
  308|       |	/* The deprecated gif-delay field is in centiseconds.
  309|       |	 */
  310|    365|	vips_image_set_int(image, "gif-delay", gif->gif_delay);
  311|       |
  312|       |	/* If there are no local palettes, we can attach the global palette as
  313|       |	 * metadata.
  314|       |	 */
  315|    365|	if (!gif->local_palette) {
  ------------------
  |  Branch (315:6): [True: 318, False: 47]
  ------------------
  316|    318|		nsgif_global_palette(gif->anim, table, &entries);
  317|    318|		vips_image_set_array_int(image, "gif-palette",
  318|    318|			(const int *) table, entries);
  319|       |
  320|    318|		colours = entries;
  321|    318|	}
  322|     47|	else {
  323|     47|		int i;
  324|       |
  325|     47|		colours = 0;
  326|       |
  327|     47|		if (gif->info->global_palette) {
  ------------------
  |  Branch (327:7): [True: 42, False: 5]
  ------------------
  328|     42|			nsgif_global_palette(gif->anim, table, &entries);
  329|     42|			colours = entries;
  330|     42|		}
  331|       |
  332|    146|		for (i = 0; i < gif->info->frame_count; i++) {
  ------------------
  |  Branch (332:15): [True: 99, False: 47]
  ------------------
  333|     99|			if (nsgif_local_palette(gif->anim, i, table,
  ------------------
  |  Branch (333:8): [True: 67, False: 32]
  ------------------
  334|     99|					&entries))
  335|     67|				colours = VIPS_MAX(colours, entries);
  ------------------
  |  |   54|     67|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 24, False: 43]
  |  |  ------------------
  ------------------
  336|     99|		}
  337|     47|	}
  338|       |
  339|    365|	vips_image_set_int(image, VIPS_META_BITS_PER_SAMPLE,
  ------------------
  |  |  100|    365|#define VIPS_META_BITS_PER_SAMPLE "bits-per-sample"
  ------------------
  340|    365|		ceil(log2(colours)));
  341|       |
  342|       |	/* Deprecated "palette-bit-depth" use "bits-per-sample" instead.
  343|       |	 */
  344|    365|	vips_image_set_int(image, "palette-bit-depth",
  345|    365|		ceil(log2(colours)));
  346|       |
  347|    365|	vips_image_set_int(image, VIPS_META_PALETTE, 1);
  ------------------
  |  |  107|    365|#define VIPS_META_PALETTE "palette"
  ------------------
  348|       |
  349|       |	/* Let our caller know if the GIF is interlaced.
  350|       |	 */
  351|    365|	if (gif->interlaced)
  ------------------
  |  Branch (351:6): [True: 55, False: 310]
  ------------------
  352|     55|		vips_image_set_int(image, "interlaced", 1);
  353|       |
  354|    365|	return 0;
  355|    365|}
nsgifload.c:vips_foreign_load_nsgif_load:
  567|    173|{
  568|    173|	VipsForeignLoadNsgif *gif = (VipsForeignLoadNsgif *) load;
  569|    173|	VipsImage **t = (VipsImage **)
  570|    173|		vips_object_local_array(VIPS_OBJECT(load), 2);
  ------------------
  |  |  433|    173|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    173|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    173|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  571|       |
  572|    173|	VIPS_DEBUG_MSG("vips_foreign_load_nsgif_load:\n");
  ------------------
  |  |   47|    173|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    173|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    173|	{ \
  |  |   49|    173|		; \
  |  |   50|    173|	} \
  |  |   51|    173|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    173|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  573|       |
  574|       |	/* Make the output pipeline.
  575|       |	 */
  576|    173|	t[0] = vips_image_new();
  577|    173|	if (vips_foreign_load_nsgif_set_header(gif, t[0]))
  ------------------
  |  Branch (577:6): [True: 0, False: 173]
  ------------------
  578|      0|		return -1;
  579|       |
  580|       |	/* Strips 8 pixels high to avoid too many tiny regions.
  581|       |	 */
  582|    173|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (582:6): [True: 0, False: 173]
  ------------------
  583|    173|			NULL, vips_foreign_load_nsgif_generate, NULL, gif, NULL) ||
  584|    173|		vips_sequential(t[0], &t[1],
  ------------------
  |  Branch (584:3): [True: 0, False: 173]
  ------------------
  585|    173|			"tile_height",
  586|    173|			vips_foreign_load_nsgif_tile_height(gif),
  587|    173|			NULL) ||
  588|    173|		vips_image_write(t[1], load->real))
  ------------------
  |  Branch (588:3): [True: 53, False: 120]
  ------------------
  589|     53|		return -1;
  590|       |
  591|    120|	return 0;
  592|    173|}
nsgifload.c:vips_foreign_load_nsgif_generate:
  479|    828|{
  480|    828|	VipsRect *r = &out_region->valid;
  481|    828|	VipsForeignLoadNsgif *gif = (VipsForeignLoadNsgif *) a;
  482|       |
  483|    828|	int y;
  484|       |
  485|       |#ifdef VERBOSE
  486|       |	VIPS_DEBUG_MSG("vips_foreign_load_nsgif_generate: "
  487|       |				   "top = %d, height = %d\n",
  488|       |		r->top, r->height);
  489|       |#endif /*VERBOSE*/
  490|       |
  491|  5.31k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (491:14): [True: 4.54k, False: 775]
  ------------------
  492|       |		/* The page for this output line, and the line number in page.
  493|       |		 */
  494|  4.54k|		int page = (r->top + y) / gif->info->height + gif->page;
  495|  4.54k|		int line = (r->top + y) % gif->info->height;
  496|       |
  497|  4.54k|		nsgif_error result;
  498|  4.54k|		VipsPel *p, *q;
  499|       |
  500|  4.54k|		g_assert(line >= 0 && line < gif->info->height);
  ------------------
  |  |  166|  4.54k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  4.54k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.54k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  501|  4.54k|		g_assert(page >= 0 && page < gif->info->frame_count);
  ------------------
  |  |  166|  4.54k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  4.54k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.54k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  502|       |
  503|  4.54k|		if (gif->frame_number != page) {
  ------------------
  |  Branch (503:7): [True: 173, False: 4.37k]
  ------------------
  504|    173|			result = nsgif_frame_decode(gif->anim,
  505|    173|				page, &gif->bitmap);
  506|    173|			VIPS_DEBUG_MSG("  nsgif_frame_decode(%d) = %d\n",
  ------------------
  |  |   47|    173|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    173|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    173|	{ \
  |  |   49|    173|		; \
  |  |   50|    173|	} \
  |  |   51|    173|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    173|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  507|    173|				page, result);
  508|    173|			if (result != NSGIF_OK) {
  ------------------
  |  Branch (508:8): [True: 53, False: 120]
  ------------------
  509|     53|				vips_foreign_load_nsgif_error(gif, result);
  510|     53|				return -1;
  511|     53|			}
  512|       |
  513|       |#ifdef VERBOSE
  514|       |			print_frame(nsgif_get_frame_info(gif->anim, page));
  515|       |#endif /*VERBOSE*/
  516|       |
  517|    120|			gif->frame_number = page;
  518|    120|		}
  519|       |
  520|  4.49k|		p = (VipsPel *) gif->bitmap + line * gif->info->width * sizeof(int);
  521|  4.49k|		q = VIPS_REGION_ADDR(out_region, 0, r->top + y);
  ------------------
  |  |  227|  4.49k|	((R)->data + \
  |  |  228|  4.49k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  4.49k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  4.49k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  4.49k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  4.49k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  4.49k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  522|  4.49k|		if (gif->has_transparency)
  ------------------
  |  Branch (522:7): [True: 2.98k, False: 1.50k]
  ------------------
  523|  2.98k|			memcpy(q, p, VIPS_REGION_SIZEOF_LINE(out_region));
  ------------------
  |  |  203|  2.98k|	((size_t) ((R)->valid.width * VIPS_REGION_SIZEOF_PEL(R)))
  |  |  ------------------
  |  |  |  |  201|  2.98k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  2.98k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  2.98k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  524|  1.50k|		else {
  525|  1.50k|			int i;
  526|       |
  527|  58.4k|			for (i = 0; i < r->width; i++) {
  ------------------
  |  Branch (527:16): [True: 56.9k, False: 1.50k]
  ------------------
  528|  56.9k|				q[0] = p[0];
  529|  56.9k|				q[1] = p[1];
  530|  56.9k|				q[2] = p[2];
  531|       |
  532|  56.9k|				q += 3;
  533|  56.9k|				p += 4;
  534|  56.9k|			}
  535|  1.50k|		}
  536|  4.49k|	}
  537|       |
  538|    775|	return 0;
  539|    828|}
nsgifload.c:vips_foreign_load_nsgif_init:
  674|    300|{
  675|    300|	nsgif_error result = nsgif_create(
  676|    300|		&vips_foreign_load_nsgif_bitmap_callbacks,
  677|    300|		NSGIF_BITMAP_FMT_R8G8B8A8,
  678|    300|		&gif->anim);
  679|    300|	if (result != NSGIF_OK) {
  ------------------
  |  Branch (679:6): [True: 0, False: 300]
  ------------------
  680|      0|		VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(gif);
  ------------------
  |  |  441|      0|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|      0|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|      0|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  681|       |
  682|      0|		vips_error(class->nickname, "%s",
  683|      0|			nsgif_strerror(result));
  684|      0|		return;
  685|      0|	}
  686|       |
  687|    300|	gif->n = 1;
  688|    300|	gif->gif_n = 1;
  689|    300|	gif->frame_number = -1;
  690|    300|	gif->bitmap = NULL;
  691|    300|}
nsgifload.c:vips_foreign_load_nsgif_bitmap_create:
  636|    173|{
  637|       |	/* GIF has a limit of 64k per axis -- double-check this.
  638|       |	 */
  639|    173|	if (width <= 0 ||
  ------------------
  |  Branch (639:6): [True: 0, False: 173]
  ------------------
  640|    173|		width > 65536 ||
  ------------------
  |  Branch (640:3): [True: 0, False: 173]
  ------------------
  641|    173|		height <= 0 ||
  ------------------
  |  Branch (641:3): [True: 0, False: 173]
  ------------------
  642|    173|		height > 65536) {
  ------------------
  |  Branch (642:3): [True: 0, False: 173]
  ------------------
  643|      0|		vips_error("gifload",
  644|      0|			"%s", _("bad image dimensions"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  645|      0|		return NULL;
  646|      0|	}
  647|       |
  648|    173|	return g_malloc0((gsize) width * height * 4);
  649|    173|}
nsgifload.c:vips_foreign_load_nsgif_bitmap_destroy:
  661|    173|{
  662|    173|	g_assert(bitmap);
  ------------------
  |  |  166|    173|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    173|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    173|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  663|    173|	g_free(bitmap);
  664|    173|}
nsgifload.c:vips_foreign_load_nsgif_bitmap_get_buffer:
  653|    189|{
  654|    189|	g_assert(bitmap);
  ------------------
  |  |  166|    189|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    189|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    189|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  655|       |
  656|    189|	return bitmap;
  657|    189|}
nsgifload.c:vips_foreign_load_nsgif_file_class_init:
  747|      1|{
  748|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  749|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  750|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  751|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  752|       |
  753|      1|	gobject_class->set_property = vips_object_set_property;
  754|      1|	gobject_class->get_property = vips_object_get_property;
  755|       |
  756|      1|	object_class->nickname = "gifload";
  757|      1|	object_class->description = _("load GIF with libnsgif");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  758|      1|	object_class->build = vips_foreign_load_gif_file_build;
  759|       |
  760|      1|	foreign_class->suffs = vips_foreign_nsgif_suffs;
  761|       |
  762|      1|	load_class->is_a = vips_foreign_load_nsgif_file_is_a;
  763|       |
  764|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  765|      1|		_("Filename"),
  766|      1|		_("Filename to load from"),
  767|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  768|      1|		G_STRUCT_OFFSET(VipsForeignLoadNsgifFile, filename),
  769|      1|		NULL);
  770|      1|}
nsgifload.c:vips_foreign_load_nsgif_is_a_source:
  198|  14.5k|{
  199|  14.5k|	const unsigned char *data;
  200|       |
  201|  14.5k|	if ((data = vips_source_sniff(source, 4)) &&
  ------------------
  |  Branch (201:6): [True: 14.5k, False: 19]
  ------------------
  202|  14.5k|		data[0] == 'G' &&
  ------------------
  |  Branch (202:3): [True: 307, False: 14.2k]
  ------------------
  203|  14.5k|		data[1] == 'I' &&
  ------------------
  |  Branch (203:3): [True: 304, False: 3]
  ------------------
  204|  14.5k|		data[2] == 'F' &&
  ------------------
  |  Branch (204:3): [True: 303, False: 1]
  ------------------
  205|  14.5k|		data[3] == '8')
  ------------------
  |  Branch (205:3): [True: 300, False: 3]
  ------------------
  206|    300|		return TRUE;
  ------------------
  |  |  798|    300|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    300|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  207|       |
  208|  14.2k|	return FALSE;
  ------------------
  |  |  794|  14.2k|#define	FALSE	(0)
  ------------------
  209|  14.5k|}
nsgifload.c:vips_foreign_load_nsgif_buffer_class_init:
  828|      1|{
  829|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  830|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  831|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  832|       |
  833|      1|	gobject_class->set_property = vips_object_set_property;
  834|      1|	gobject_class->get_property = vips_object_get_property;
  835|       |
  836|      1|	object_class->nickname = "gifload_buffer";
  837|      1|	object_class->description = _("load GIF with libnsgif");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  838|      1|	object_class->build = vips_foreign_load_nsgif_buffer_build;
  839|       |
  840|      1|	load_class->is_a_buffer = vips_foreign_load_nsgif_buffer_is_a_buffer;
  841|       |
  842|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  843|      1|		_("Buffer"),
  844|      1|		_("Buffer to load from"),
  845|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  846|      1|		G_STRUCT_OFFSET(VipsForeignLoadNsgifBuffer, blob),
  847|      1|		VIPS_TYPE_BLOB);
  848|      1|}
nsgifload.c:vips_foreign_load_nsgif_buffer_build:
  793|    300|{
  794|    300|	VipsForeignLoadNsgif *gif = (VipsForeignLoadNsgif *) object;
  795|    300|	VipsForeignLoadNsgifBuffer *buffer =
  796|    300|		(VipsForeignLoadNsgifBuffer *) object;
  797|       |
  798|    300|	if (buffer->blob &&
  ------------------
  |  Branch (798:6): [True: 300, False: 0]
  ------------------
  799|    300|		!(gif->source = vips_source_new_from_memory(
  ------------------
  |  Branch (799:3): [True: 0, False: 300]
  ------------------
  800|    300|			  buffer->blob->data,
  801|    300|			  buffer->blob->length)))
  802|      0|		return -1;
  803|       |
  804|    300|	if (VIPS_OBJECT_CLASS(vips_foreign_load_nsgif_buffer_parent_class)
  ------------------
  |  |  435|    300|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    300|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    300|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (804:6): [True: 108, False: 192]
  ------------------
  805|    300|			->build(object))
  806|    108|		return -1;
  807|       |
  808|    192|	return 0;
  809|    300|}
nsgifload.c:vips_foreign_load_nsgif_buffer_is_a_buffer:
  813|  14.5k|{
  814|  14.5k|	VipsSource *source;
  815|  14.5k|	gboolean result;
  816|       |
  817|  14.5k|	if (!(source = vips_source_new_from_memory(buf, len)))
  ------------------
  |  Branch (817:6): [True: 0, False: 14.5k]
  ------------------
  818|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  819|  14.5k|	result = vips_foreign_load_nsgif_is_a_source(source);
  820|  14.5k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  14.5k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  14.5k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  14.5k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  14.5k|	{ \
  |  |  |  |   43|  14.5k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 14.5k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  14.5k|			(void) F((S)); \
  |  |  |  |   45|  14.5k|			(S) = 0; \
  |  |  |  |   46|  14.5k|		} \
  |  |  |  |   47|  14.5k|	} \
  |  |  |  |   48|  14.5k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  14.5k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  821|       |
  822|  14.5k|	return result;
  823|  14.5k|}
nsgifload.c:vips_foreign_load_nsgif_buffer_init:
  852|    300|{
  853|    300|}
nsgifload.c:vips_foreign_load_nsgif_source_class_init:
  891|      1|{
  892|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  893|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  894|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  895|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  896|       |
  897|      1|	gobject_class->set_property = vips_object_set_property;
  898|      1|	gobject_class->get_property = vips_object_get_property;
  899|       |
  900|      1|	object_class->nickname = "gifload_source";
  901|      1|	object_class->description = _("load gif from source");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  902|      1|	object_class->build = vips_foreign_load_nsgif_source_build;
  903|       |
  904|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  905|       |
  906|      1|	load_class->is_a_source = vips_foreign_load_nsgif_is_a_source;
  907|       |
  908|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  909|      1|		_("Source"),
  910|      1|		_("Source to load from"),
  911|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  912|      1|		G_STRUCT_OFFSET(VipsForeignLoadNsgifSource, source),
  913|      1|		VIPS_TYPE_SOURCE);
  914|      1|}

vips__pdf_is_a_buffer:
   56|  6.36k|{
   57|  6.36k|	const char *str = (const char *) buf;
   58|       |
   59|  6.36k|	if (len < 4)
  ------------------
  |  Branch (59:6): [True: 17, False: 6.34k]
  ------------------
   60|     17|		return FALSE;
  ------------------
  |  |  794|     17|#define	FALSE	(0)
  ------------------
   61|       |
   62|  13.7M|	for (size_t i = 0; i < len - 4; i++)
  ------------------
  |  Branch (62:21): [True: 13.7M, False: 6.32k]
  ------------------
   63|  13.7M|		if (vips_isprefix("%PDF", str + i))
  ------------------
  |  Branch (63:7): [True: 21, False: 13.7M]
  ------------------
   64|     21|			return TRUE;
  ------------------
  |  |  798|  6.36k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|     21|#define	FALSE	(0)
  |  |  ------------------
  ------------------
   65|       |
   66|  6.32k|	return FALSE;
  ------------------
  |  |  794|  6.32k|#define	FALSE	(0)
  ------------------
   67|  6.34k|}

pdfiumload.c:vips_foreign_load_pdf_class_init:
  675|      1|{
  676|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  677|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  678|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  679|       |
  680|      1|	gobject_class->dispose = vips_foreign_load_pdf_dispose;
  681|      1|	gobject_class->set_property = vips_object_set_property;
  682|      1|	gobject_class->get_property = vips_object_get_property;
  683|       |
  684|      1|	object_class->nickname = "pdfload_base";
  685|      1|	object_class->description = _("load PDF with PDFium");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  686|      1|	object_class->build = vips_foreign_load_pdf_build;
  687|       |
  688|      1|	load_class->get_flags_filename =
  689|      1|		vips_foreign_load_pdf_get_flags_filename;
  690|      1|	load_class->get_flags = vips_foreign_load_pdf_get_flags;
  691|      1|	load_class->header = vips_foreign_load_pdf_header;
  692|      1|	load_class->load = vips_foreign_load_pdf_load;
  693|       |
  694|      1|	VIPS_ARG_INT(class, "page", 10,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  695|      1|		_("Page"),
  696|      1|		_("First page to load"),
  697|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  698|      1|		G_STRUCT_OFFSET(VipsForeignLoadPdf, page_no),
  699|      1|		0, 100000, 0);
  700|       |
  701|      1|	VIPS_ARG_INT(class, "n", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  702|      1|		_("n"),
  703|      1|		_("Number of pages to load, -1 for all"),
  704|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  705|      1|		G_STRUCT_OFFSET(VipsForeignLoadPdf, n),
  706|      1|		-1, 100000, 1);
  707|       |
  708|      1|	VIPS_ARG_DOUBLE(class, "dpi", 12,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  709|      1|		_("DPI"),
  710|      1|		_("DPI to render at"),
  711|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  712|      1|		G_STRUCT_OFFSET(VipsForeignLoadPdf, dpi),
  713|      1|		0.001, 100000.0, 72.0);
  714|       |
  715|      1|	VIPS_ARG_DOUBLE(class, "scale", 13,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  716|      1|		_("Scale"),
  717|      1|		_("Factor to scale by"),
  718|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  719|      1|		G_STRUCT_OFFSET(VipsForeignLoadPdf, scale),
  720|      1|		0.0, 100000.0, 1.0);
  721|       |
  722|      1|	VIPS_ARG_BOXED(class, "background", 14,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  723|      1|		_("Background"),
  724|      1|		_("Background colour"),
  725|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  726|      1|		G_STRUCT_OFFSET(VipsForeignLoadPdf, background),
  727|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  728|       |
  729|      1|	VIPS_ARG_STRING(class, "password", 25,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  730|      1|		_("Password"),
  731|      1|		_("Password to decrypt with"),
  732|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  733|      1|		G_STRUCT_OFFSET(VipsForeignLoadPdf, password),
  734|      1|		NULL);
  735|      1|}
pdfiumload.c:vips_foreign_load_pdf_dispose:
  214|     21|{
  215|     21|	VipsForeignLoadPdf *pdf = (VipsForeignLoadPdf *) gobject;
  216|       |
  217|     21|	vips_foreign_load_pdf_close(pdf);
  218|       |
  219|     21|	G_OBJECT_CLASS(vips_foreign_load_pdf_parent_class)->dispose(gobject);
  ------------------
  |  |   58|     21|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|     21|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|     21|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  220|     21|}
pdfiumload.c:vips_foreign_load_pdf_close:
  201|     21|{
  202|     21|	g_mutex_lock(&vips_pdfium_mutex);
  203|       |
  204|     21|	VIPS_FREEF(FPDF_ClosePage, pdf->page);
  ------------------
  |  |   41|     21|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     21|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|     21|	{ \
  |  |   43|     21|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 9, False: 12]
  |  |  ------------------
  |  |   44|      9|			(void) F((S)); \
  |  |   45|      9|			(S) = 0; \
  |  |   46|      9|		} \
  |  |   47|     21|	} \
  |  |   48|     21|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     21|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|     21|	VIPS_FREEF(FPDFDOC_ExitFormFillEnvironment, pdf->form);
  ------------------
  |  |   41|     21|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     21|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|     21|	{ \
  |  |   43|     21|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 11, False: 10]
  |  |  ------------------
  |  |   44|     11|			(void) F((S)); \
  |  |   45|     11|			(S) = 0; \
  |  |   46|     11|		} \
  |  |   47|     21|	} \
  |  |   48|     21|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     21|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  206|     21|	VIPS_FREEF(FPDF_CloseDocument, pdf->doc);
  ------------------
  |  |   41|     21|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     21|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|     21|	{ \
  |  |   43|     21|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 11, False: 10]
  |  |  ------------------
  |  |   44|     11|			(void) F((S)); \
  |  |   45|     11|			(S) = 0; \
  |  |   46|     11|		} \
  |  |   47|     21|	} \
  |  |   48|     21|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     21|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  207|     21|	VIPS_UNREF(pdf->source);
  ------------------
  |  |   57|     21|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|     21|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|     21|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|     21|	{ \
  |  |  |  |   43|     21|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 21, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|     21|			(void) F((S)); \
  |  |  |  |   45|     21|			(S) = 0; \
  |  |  |  |   46|     21|		} \
  |  |  |  |   47|     21|	} \
  |  |  |  |   48|     21|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|     21|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  208|       |
  209|     21|	g_mutex_unlock(&vips_pdfium_mutex);
  210|     21|}
pdfiumload.c:vips_foreign_load_pdf_build:
  269|     21|{
  270|     21|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|     21|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
  271|       |
  272|     21|	VipsForeignLoadPdf *pdf = (VipsForeignLoadPdf *) object;
  273|     21|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(pdf);
  ------------------
  |  |  441|     21|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|     21|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|     21|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  274|       |
  275|     21|	gint64 length;
  276|       |
  277|     21|	VIPS_ONCE(&once, vips_pdfium_init_cb, NULL);
  ------------------
  |  |   93|     21|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     21|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|     21|	{ \
  |  |   95|     21|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|     21|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|     21| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|     21|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|     21|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|     21|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 20]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|     21|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|     21|   else                                         \
  |  |  |  |  |  |  931|     21|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|     21|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|     21|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 20]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|     21|			(void) g_once(ONCE, FUNC, CLIENT); \
  |  |  ------------------
  |  |  |  |  241|      1|  (((once)->status == G_ONCE_STATUS_READY) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (241:4): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  |  |  242|      1|   (once)->retval : \
  |  |  |  |  243|      1|   g_once_impl ((once), (func), (arg)))
  |  |  ------------------
  |  |   97|     21|	} \
  |  |   98|     21|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     21|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  278|       |
  279|     21|	if (!vips_object_argument_isset(object, "scale"))
  ------------------
  |  Branch (279:6): [True: 21, False: 0]
  ------------------
  280|     21|		pdf->scale = pdf->dpi / 72.0; // FIXME: Invalidates operation cache
  281|       |
  282|     21|	pdf->form_callbacks.version = 2;
  283|       |
  284|       |	/* pdfium must know the file length, unfortunately.
  285|       |	 */
  286|     21|	if (pdf->source) {
  ------------------
  |  Branch (286:6): [True: 21, False: 0]
  ------------------
  287|     21|		if ((length = vips_source_length(pdf->source)) <= 0)
  ------------------
  |  Branch (287:7): [True: 0, False: 21]
  ------------------
  288|      0|			return -1;
  289|     21|		if (length > 1 << 30) {
  ------------------
  |  Branch (289:7): [True: 0, False: 21]
  ------------------
  290|      0|			vips_error(class->nickname,
  291|      0|				_("%s: too large for pdfium"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  292|      0|				vips_connection_nick(
  293|      0|					VIPS_CONNECTION(pdf->source)));
  ------------------
  |  |   48|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|      0|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  294|      0|			return -1;
  295|      0|		}
  296|     21|		pdf->file_access.m_FileLen = length;
  297|     21|		pdf->file_access.m_GetBlock = vips_pdfium_GetBlock;
  298|     21|		pdf->file_access.m_Param = pdf;
  299|       |
  300|     21|		g_mutex_lock(&vips_pdfium_mutex);
  301|       |
  302|     21|		if (!(pdf->doc = FPDF_LoadCustomDocument(&pdf->file_access,
  ------------------
  |  Branch (302:7): [True: 10, False: 11]
  ------------------
  303|     21|				  pdf->password))) {
  304|     10|			g_mutex_unlock(&vips_pdfium_mutex);
  305|     10|			vips_pdfium_error();
  306|     10|			vips_error("pdfload",
  307|     10|				_("%s: unable to load"),
  ------------------
  |  |   30|     10|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     10|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  308|     10|				vips_connection_nick(
  309|     10|					VIPS_CONNECTION(pdf->source)));
  ------------------
  |  |   48|     10|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     10|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     10|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|     10|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  310|     10|			return -1;
  311|     10|		}
  312|       |
  313|     11|		if (!(pdf->form = FPDFDOC_InitFormFillEnvironment(pdf->doc,
  ------------------
  |  Branch (313:7): [True: 0, False: 11]
  ------------------
  314|     11|				  &pdf->form_callbacks))) {
  315|      0|			g_mutex_unlock(&vips_pdfium_mutex);
  316|      0|			vips_pdfium_error();
  317|      0|			vips_error("pdfload",
  318|      0|				_("%s: unable to initialize form fill environment"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  319|      0|				vips_connection_nick(
  320|      0|					VIPS_CONNECTION(pdf->source)));
  ------------------
  |  |   48|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|      0|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  321|      0|			return -1;
  322|      0|		}
  323|       |
  324|     11|		g_mutex_unlock(&vips_pdfium_mutex);
  325|     11|	}
  326|       |
  327|     11|	if (VIPS_OBJECT_CLASS(vips_foreign_load_pdf_parent_class)->build(object))
  ------------------
  |  |  435|     11|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|     11|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|     11|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (327:6): [True: 2, False: 9]
  ------------------
  328|      2|		return -1;
  329|       |
  330|      9|	return 0;
  331|     11|}
pdfiumload.c:vips_pdfium_init_cb:
  224|      1|{
  225|      1|	FPDF_LIBRARY_CONFIG config;
  226|       |
  227|      1|	config.version = 2;
  228|      1|	config.m_pUserFontPaths = NULL;
  229|      1|	config.m_pIsolate = NULL;
  230|      1|	config.m_v8EmbedderSlot = 0;
  231|       |
  232|      1|	FPDF_InitLibraryWithConfig(&config);
  233|       |
  234|      1|	return NULL;
  235|      1|}
pdfiumload.c:vips_pdfium_GetBlock:
  242|  2.42k|{
  243|  2.42k|	VipsForeignLoadPdf *pdf = (VipsForeignLoadPdf *) param;
  244|       |
  245|       |	/* PDFium guarantees these.
  246|       |	 */
  247|  2.42k|	g_assert(size > 0);
  ------------------
  |  |  166|  2.42k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.42k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.42k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  248|  2.42k|	g_assert(position >= 0);
  ------------------
  |  |  166|  2.42k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.42k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.42k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  249|  2.42k|	g_assert(position + size <= pdf->file_access.m_FileLen);
  ------------------
  |  |  166|  2.42k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.42k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.42k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|       |
  251|  2.42k|	if (vips_source_seek(pdf->source, position, SEEK_SET) < 0)
  ------------------
  |  Branch (251:6): [True: 0, False: 2.42k]
  ------------------
  252|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  253|       |
  254|  4.84k|	while (size > 0) {
  ------------------
  |  Branch (254:9): [True: 2.42k, False: 2.42k]
  ------------------
  255|  2.42k|		gint64 bytes_read;
  256|       |
  257|  2.42k|		if ((bytes_read =
  ------------------
  |  Branch (257:7): [True: 0, False: 2.42k]
  ------------------
  258|  2.42k|					vips_source_read(pdf->source, pBuf, size)) < 0)
  259|      0|			return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  260|  2.42k|		pBuf += bytes_read;
  261|  2.42k|		size -= bytes_read;
  262|  2.42k|	}
  263|       |
  264|  2.42k|	return TRUE;
  ------------------
  |  |  798|  2.42k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  2.42k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  265|  2.42k|}
pdfiumload.c:vips_pdfium_error:
  189|     12|{
  190|     12|	int err = FPDF_GetLastError();
  191|       |
  192|     12|	if (err >= 0 &&
  ------------------
  |  Branch (192:6): [True: 12, False: 0]
  ------------------
  193|     12|		err < VIPS_NUMBER(vips_pdfium_errors))
  ------------------
  |  |   60|     12|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (193:3): [True: 12, False: 0]
  ------------------
  194|     12|		vips_error("pdfload", "%s", _(vips_pdfium_errors[err]));
  ------------------
  |  |   30|     12|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     12|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  195|      0|	else
  196|      0|		vips_error("pdfload", "%s", _("unknown error"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  197|     12|}
pdfiumload.c:vips_foreign_load_pdf_get_flags:
  343|     11|{
  344|     11|	return VIPS_FOREIGN_PARTIAL;
  345|     11|}
pdfiumload.c:vips_foreign_load_pdf_header:
  455|     11|{
  456|     11|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(load);
  ------------------
  |  |  441|     11|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|     11|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|     11|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  457|     11|	VipsForeignLoadPdf *pdf = (VipsForeignLoadPdf *) load;
  458|       |
  459|     11|	int top;
  460|     11|	int i;
  461|       |
  462|       |#ifdef DEBUG
  463|       |	printf("vips_foreign_load_pdf_header: %p\n", pdf);
  464|       |#endif /*DEBUG*/
  465|       |
  466|     11|	g_mutex_lock(&vips_pdfium_mutex);
  467|     11|	pdf->n_pages = FPDF_GetPageCount(pdf->doc);
  468|     11|	g_mutex_unlock(&vips_pdfium_mutex);
  469|       |
  470|       |	/* @n == -1 means until the end of the doc.
  471|       |	 */
  472|     11|	if (pdf->n == -1)
  ------------------
  |  Branch (472:6): [True: 0, False: 11]
  ------------------
  473|      0|		pdf->n = pdf->n_pages - pdf->page_no; // FIXME: Invalidates operation cache
  474|       |
  475|     11|	if (pdf->page_no + pdf->n > pdf->n_pages ||
  ------------------
  |  Branch (475:6): [True: 0, False: 11]
  ------------------
  476|     11|		pdf->page_no < 0 ||
  ------------------
  |  Branch (476:3): [True: 0, False: 11]
  ------------------
  477|     11|		pdf->n <= 0) {
  ------------------
  |  Branch (477:3): [True: 0, False: 11]
  ------------------
  478|      0|		vips_error(class->nickname, "%s", _("pages out of range"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  479|      0|		return -1;
  480|      0|	}
  481|       |
  482|       |	/* Lay out the pages in our output image.
  483|       |	 */
  484|     11|	if (!(pdf->pages = VIPS_ARRAY(pdf, pdf->n, VipsRect)))
  ------------------
  |  |   72|     11|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|     11|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|     11|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|     11|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|     11|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (484:6): [True: 0, False: 11]
  ------------------
  485|      0|		return -1;
  486|       |
  487|     11|	top = 0;
  488|     11|	pdf->image.left = 0;
  489|     11|	pdf->image.top = 0;
  490|     11|	pdf->image.width = 0;
  491|     11|	pdf->image.height = 0;
  492|     20|	for (i = 0; i < pdf->n; i++) {
  ------------------
  |  Branch (492:14): [True: 11, False: 9]
  ------------------
  493|     11|		if (vips_foreign_load_pdf_get_page(pdf, pdf->page_no + i))
  ------------------
  |  Branch (493:7): [True: 2, False: 9]
  ------------------
  494|      2|			return -1;
  495|      9|		pdf->pages[i].left = 0;
  496|      9|		pdf->pages[i].top = top;
  497|       |		/* We do round to nearest, in the same way that vips_resize()
  498|       |		 * does round to nearest. Without this, things like
  499|       |		 * shrink-on-load will break.
  500|       |		 */
  501|      9|		pdf->pages[i].width = VIPS_RINT(
  ------------------
  |  |   74|      9|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  502|      9|			FPDF_GetPageWidth(pdf->page) * pdf->scale);
  503|      9|		pdf->pages[i].height = VIPS_RINT(
  ------------------
  |  |   74|      9|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  504|      9|			FPDF_GetPageHeight(pdf->page) * pdf->scale);
  505|       |
  506|       |		/* PDFium allows page width or height to be less than 1 (!!).
  507|       |		 */
  508|      9|		if (pdf->pages[i].width < 1 ||
  ------------------
  |  Branch (508:7): [True: 0, False: 9]
  ------------------
  509|      9|			pdf->pages[i].height < 1 ||
  ------------------
  |  Branch (509:4): [True: 0, False: 9]
  ------------------
  510|      9|			pdf->pages[i].width > VIPS_MAX_COORD ||
  ------------------
  |  |   69|     18|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (510:4): [True: 0, False: 9]
  ------------------
  511|      9|			pdf->pages[i].height > VIPS_MAX_COORD) {
  ------------------
  |  |   69|      9|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (511:4): [True: 0, False: 9]
  ------------------
  512|      0|			vips_error(class->nickname,
  513|      0|				"%s", _("page size out of range"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  514|      0|			return -1;
  515|      0|		}
  516|       |
  517|      9|		if (pdf->pages[i].width > pdf->image.width)
  ------------------
  |  Branch (517:7): [True: 9, False: 0]
  ------------------
  518|      9|			pdf->image.width = pdf->pages[i].width;
  519|      9|		pdf->image.height += pdf->pages[i].height;
  520|       |
  521|      9|		top += pdf->pages[i].height;
  522|      9|	}
  523|       |
  524|       |	/* If all pages are the same height, we can tag this as a toilet roll
  525|       |	 * image.
  526|       |	 */
  527|      9|	for (i = 1; i < pdf->n; i++)
  ------------------
  |  Branch (527:14): [True: 0, False: 9]
  ------------------
  528|      0|		if (pdf->pages[i].height != pdf->pages[0].height)
  ------------------
  |  Branch (528:7): [True: 0, False: 0]
  ------------------
  529|      0|			break;
  530|       |
  531|       |	/* Only set page-height if we have more than one page, or this could
  532|       |	 * accidentally turn into an animated image later.
  533|       |	 */
  534|      9|	if (pdf->n > 1)
  ------------------
  |  Branch (534:6): [True: 0, False: 9]
  ------------------
  535|      0|		vips_image_set_int(load->out,
  536|      0|			VIPS_META_PAGE_HEIGHT, pdf->pages[0].height);
  ------------------
  |  |  158|      0|#define VIPS_META_PAGE_HEIGHT "page-height"
  ------------------
  537|       |
  538|      9|	vips_foreign_load_pdf_set_image(pdf, load->out);
  539|       |
  540|       |	/* Convert the background to the image format.
  541|       |	 */
  542|      9|	if (!(pdf->ink = vips__vector_to_ink(class->nickname,
  ------------------
  |  Branch (542:6): [True: 0, False: 9]
  ------------------
  543|      9|			  load->out,
  544|      9|			  VIPS_AREA(pdf->background)->data, NULL,
  ------------------
  |  |  137|      9|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  545|      9|			  VIPS_AREA(pdf->background)->n)))
  ------------------
  |  |  137|      9|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  546|      0|		return -1;
  547|      9|	vips__bgra2rgba((guint32 *) pdf->ink, 1);
  548|       |
  549|      9|	return 0;
  550|      9|}
pdfiumload.c:vips_foreign_load_pdf_get_page:
  349|     11|{
  350|     11|	if (pdf->current_page != page_no) {
  ------------------
  |  Branch (350:6): [True: 11, False: 0]
  ------------------
  351|     11|		VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(pdf);
  ------------------
  |  |  441|     11|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|     11|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|     11|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  352|       |
  353|     11|		g_mutex_lock(&vips_pdfium_mutex);
  354|       |
  355|     11|		VIPS_FREEF(FPDF_ClosePage, pdf->page);
  ------------------
  |  |   41|     11|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     11|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|     11|	{ \
  |  |   43|     11|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 11]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|     11|	} \
  |  |   48|     11|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     11|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  356|     11|		pdf->current_page = -1;
  357|       |
  358|       |#ifdef DEBUG
  359|       |		printf("vips_foreign_load_pdf_get_page: %d\n", page_no);
  360|       |#endif /*DEBUG*/
  361|       |
  362|     11|		if (!(pdf->page = FPDF_LoadPage(pdf->doc, page_no))) {
  ------------------
  |  Branch (362:7): [True: 2, False: 9]
  ------------------
  363|      2|			g_mutex_unlock(&vips_pdfium_mutex);
  364|      2|			vips_pdfium_error();
  365|      2|			vips_error(class->nickname,
  366|      2|				_("unable to load page %d"), page_no);
  ------------------
  |  |   30|      2|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      2|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  367|      2|			return -1;
  368|      2|		}
  369|      9|		pdf->current_page = page_no;
  370|       |
  371|      9|		g_mutex_unlock(&vips_pdfium_mutex);
  372|      9|	}
  373|       |
  374|      9|	return 0;
  375|     11|}
pdfiumload.c:vips_foreign_load_pdf_set_image:
  397|      9|{
  398|      9|	int i;
  399|      9|	double res;
  400|       |
  401|       |#ifdef DEBUG
  402|       |	printf("vips_foreign_load_pdf_set_image: %p\n", pdf);
  403|       |#endif /*DEBUG*/
  404|       |
  405|       |	/* We render to a tilecache, so it has to be SMALLTILE.
  406|       |	 */
  407|      9|	if (vips_image_pipelinev(out, VIPS_DEMAND_STYLE_SMALLTILE, NULL))
  ------------------
  |  Branch (407:6): [True: 0, False: 9]
  ------------------
  408|      0|		return -1;
  409|       |
  410|       |	/* Extract and attach metadata. Set the old name too for compat.
  411|       |	 */
  412|      9|	vips_image_set_int(out, "pdf-n_pages", pdf->n_pages);
  413|      9|	vips_image_set_int(out, VIPS_META_N_PAGES, pdf->n_pages);
  ------------------
  |  |  165|      9|#define VIPS_META_N_PAGES "n-pages"
  ------------------
  414|       |
  415|      9|	g_mutex_lock(&vips_pdfium_mutex);
  416|       |
  417|     63|	for (i = 0; i < n_metadata; i++) {
  ------------------
  |  Branch (417:14): [True: 54, False: 9]
  ------------------
  418|     54|		VipsForeignLoadPdfMetadata *metadata =
  419|     54|			&vips_foreign_load_pdf_metadata[i];
  420|       |
  421|     54|		char text[1024];
  422|     54|		int len;
  423|       |
  424|     54|		len = FPDF_GetMetaText(pdf->doc, metadata->tag, text, 1024);
  425|     54|		if (len > 0) {
  ------------------
  |  Branch (425:7): [True: 0, False: 54]
  ------------------
  426|      0|			char *str;
  427|       |
  428|       |			/* Silently ignore coding errors.
  429|       |			 */
  430|      0|			if ((str = g_utf16_to_utf8((gunichar2 *) text, len,
  ------------------
  |  Branch (430:8): [True: 0, False: 0]
  ------------------
  431|      0|					 NULL, NULL, NULL))) {
  432|      0|				vips_image_set_string(out,
  433|      0|					metadata->field, str);
  434|      0|				g_free(str);
  435|      0|			}
  436|      0|		}
  437|     54|	}
  438|       |
  439|      9|	g_mutex_unlock(&vips_pdfium_mutex);
  440|       |
  441|       |	/* We need pixels/mm for vips.
  442|       |	 */
  443|      9|	res = pdf->dpi / 25.4;
  444|       |
  445|      9|	vips_image_init_fields(out,
  446|      9|		pdf->image.width, pdf->image.height,
  447|      9|		4, VIPS_FORMAT_UCHAR,
  448|      9|		VIPS_CODING_NONE, VIPS_INTERPRETATION_sRGB, res, res);
  449|       |
  450|      9|	return 0;
  451|      9|}
pdfiumload.c:vips_foreign_load_pdf_init:
  739|     21|{
  740|     21|	pdf->dpi = 72.0;
  741|     21|	pdf->scale = 1.0;
  742|     21|	pdf->n = 1;
  743|     21|	pdf->current_page = -1;
  744|     21|	pdf->background = vips_array_double_newv(1, 255.0);
  745|     21|}
pdfiumload.c:vips_foreign_load_pdf_file_class_init:
  793|      1|{
  794|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  795|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  796|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  797|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  798|       |
  799|      1|	gobject_class->set_property = vips_object_set_property;
  800|      1|	gobject_class->get_property = vips_object_get_property;
  801|       |
  802|      1|	object_class->nickname = "pdfload";
  803|      1|	object_class->description = _("load PDF from file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  804|      1|	object_class->build = vips_foreign_load_pdf_file_build;
  805|       |
  806|      1|	foreign_class->suffs = vips__pdf_suffs;
  807|       |
  808|      1|	load_class->is_a = vips__pdf_is_a_file;
  809|      1|	load_class->header = vips_foreign_load_pdf_file_header;
  810|       |
  811|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  812|      1|		_("Filename"),
  813|      1|		_("Filename to load from"),
  814|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  815|      1|		G_STRUCT_OFFSET(VipsForeignLoadPdfFile, filename),
  816|      1|		NULL);
  817|      1|}
pdfiumload.c:vips_foreign_load_pdf_buffer_class_init:
  857|      1|{
  858|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  859|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  860|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  861|       |
  862|      1|	gobject_class->set_property = vips_object_set_property;
  863|      1|	gobject_class->get_property = vips_object_get_property;
  864|       |
  865|      1|	object_class->nickname = "pdfload_buffer";
  866|      1|	object_class->description = _("load PDF from buffer");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  867|      1|	object_class->build = vips_foreign_load_pdf_buffer_build;
  868|       |
  869|      1|	load_class->is_a_buffer = vips__pdf_is_a_buffer;
  870|       |
  871|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  872|      1|		_("Buffer"),
  873|      1|		_("Buffer to load from"),
  874|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  875|      1|		G_STRUCT_OFFSET(VipsForeignLoadPdfBuffer, buf),
  876|      1|		VIPS_TYPE_BLOB);
  877|      1|}
pdfiumload.c:vips_foreign_load_pdf_buffer_build:
  840|     21|{
  841|     21|	VipsForeignLoadPdf *pdf = (VipsForeignLoadPdf *) object;
  842|     21|	VipsForeignLoadPdfBuffer *buffer = (VipsForeignLoadPdfBuffer *) pdf;
  843|       |
  844|     21|	if (buffer->buf &&
  ------------------
  |  Branch (844:6): [True: 21, False: 0]
  ------------------
  845|     21|		!(pdf->source = vips_source_new_from_memory(
  ------------------
  |  Branch (845:3): [True: 0, False: 21]
  ------------------
  846|     21|			  VIPS_AREA(buffer->buf)->data,
  ------------------
  |  |  137|     21|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  847|     21|			  VIPS_AREA(buffer->buf)->length)))
  ------------------
  |  |  137|     21|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  848|      0|		return -1;
  849|       |
  850|     21|	return VIPS_OBJECT_CLASS(vips_foreign_load_pdf_buffer_parent_class)
  ------------------
  |  |  435|     21|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|     21|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|     21|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  851|     21|		->build(object);
  852|     21|}
pdfiumload.c:vips_foreign_load_pdf_buffer_init:
  881|     21|{
  882|     21|}
pdfiumload.c:vips_foreign_load_pdf_source_class_init:
  914|      1|{
  915|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  916|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  917|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  918|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  919|       |
  920|      1|	gobject_class->set_property = vips_object_set_property;
  921|      1|	gobject_class->get_property = vips_object_get_property;
  922|       |
  923|      1|	object_class->nickname = "pdfload_source";
  924|      1|	object_class->description = _("load PDF from source");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  925|      1|	object_class->build = vips_foreign_load_pdf_source_build;
  926|       |
  927|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  928|       |
  929|      1|	load_class->is_a_source = vips__pdf_is_a_source;
  930|       |
  931|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  932|      1|		_("Source"),
  933|      1|		_("Source to load from"),
  934|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  935|      1|		G_STRUCT_OFFSET(VipsForeignLoadPdfSource, source),
  936|      1|		VIPS_TYPE_SOURCE);
  937|      1|}

ppmload.c:vips_foreign_load_ppm_class_init:
  734|      1|{
  735|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  736|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  737|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  738|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  739|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  740|       |
  741|      1|	gobject_class->dispose = vips_foreign_load_ppm_dispose;
  742|      1|	gobject_class->set_property = vips_object_set_property;
  743|      1|	gobject_class->get_property = vips_object_get_property;
  744|       |
  745|      1|	object_class->nickname = "ppmload_base";
  746|      1|	object_class->description = _("load ppm base class");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  747|      1|	object_class->build = vips_foreign_load_ppm_build;
  748|       |
  749|       |	/* You're unlikely to want to use this on untrusted files.
  750|       |	 */
  751|      1|	operation_class->flags |= VIPS_OPERATION_UNTRUSTED;
  752|       |
  753|      1|	foreign_class->suffs = vips__ppm_suffs;
  754|       |
  755|       |	/* We are fast at is_a(), so high priority.
  756|       |	 */
  757|      1|	foreign_class->priority = 200;
  758|       |
  759|      1|	load_class->get_flags = vips_foreign_load_ppm_get_flags;
  760|      1|	load_class->header = vips_foreign_load_ppm_header;
  761|      1|	load_class->load = vips_foreign_load_ppm_load;
  762|      1|}
ppmload.c:vips_foreign_load_ppm_file_class_init:
  814|      1|{
  815|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  816|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  817|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  818|       |
  819|      1|	gobject_class->set_property = vips_object_set_property;
  820|      1|	gobject_class->get_property = vips_object_get_property;
  821|       |
  822|      1|	object_class->nickname = "ppmload";
  823|      1|	object_class->description = _("load ppm from file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  824|      1|	object_class->build = vips_foreign_load_ppm_file_build;
  825|       |
  826|      1|	load_class->is_a = vips_foreign_load_ppm_file_is_a;
  827|       |
  828|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  829|      1|		_("Filename"),
  830|      1|		_("Filename to load from"),
  831|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  832|      1|		G_STRUCT_OFFSET(VipsForeignLoadPpmFile, filename),
  833|      1|		NULL);
  834|      1|}
ppmload.c:vips_foreign_load_ppm_source_class_init:
  873|      1|{
  874|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  875|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  876|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  877|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  878|       |
  879|      1|	gobject_class->set_property = vips_object_set_property;
  880|      1|	gobject_class->get_property = vips_object_get_property;
  881|       |
  882|      1|	object_class->nickname = "ppmload_source";
  883|      1|	object_class->build = vips_foreign_load_ppm_source_build;
  884|       |
  885|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  886|       |
  887|      1|	load_class->is_a_source = vips_foreign_load_ppm_is_a_source;
  888|       |
  889|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  890|      1|		_("Source"),
  891|      1|		_("Source to load from"),
  892|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  893|      1|		G_STRUCT_OFFSET(VipsForeignLoadPpmSource, source),
  894|      1|		VIPS_TYPE_SOURCE);
  895|      1|}

ppmsave.c:vips_foreign_save_ppm_class_init:
  490|      1|{
  491|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  492|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  493|      1|	VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
  494|       |
  495|      1|	gobject_class->dispose = vips_foreign_save_ppm_dispose;
  496|      1|	gobject_class->set_property = vips_object_set_property;
  497|      1|	gobject_class->get_property = vips_object_get_property;
  498|       |
  499|      1|	object_class->nickname = "ppmsave_base";
  500|      1|	object_class->description = _("save to ppm");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  501|      1|	object_class->build = vips_foreign_save_ppm_build;
  502|       |
  503|      1|	save_class->saveable = VIPS_SAVEABLE_ANY;
  504|      1|	save_class->format_table = bandfmt_ppm;
  505|       |
  506|      1|	VIPS_ARG_ENUM(class, "format", 2,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  507|      1|		_("Format"),
  508|      1|		_("Format to save in"),
  509|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  510|      1|		G_STRUCT_OFFSET(VipsForeignSavePpm, format),
  511|      1|		VIPS_TYPE_FOREIGN_PPM_FORMAT,
  512|      1|		VIPS_FOREIGN_PPM_FORMAT_PPM);
  513|       |
  514|      1|	VIPS_ARG_BOOL(class, "ascii", 10,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  515|      1|		_("ASCII"),
  516|      1|		_("Save as ascii"),
  517|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  518|      1|		G_STRUCT_OFFSET(VipsForeignSavePpm, ascii),
  519|      1|		FALSE);
  520|       |
  521|      1|	VIPS_ARG_INT(class, "bitdepth", 15,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  522|      1|		_("Bit depth"),
  523|      1|		_("Set to 1 to write as a 1 bit image"),
  524|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  525|      1|		G_STRUCT_OFFSET(VipsForeignSavePpm, bitdepth),
  526|      1|		0, 1, 0);
  527|       |
  528|      1|	VIPS_ARG_BOOL(class, "squash", 11,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  529|      1|		_("Squash"),
  530|      1|		_("Save as one bit"),
  531|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  532|      1|		G_STRUCT_OFFSET(VipsForeignSavePpm, squash),
  533|      1|		FALSE);
  534|      1|}
ppmsave.c:vips_foreign_save_ppm_file_class_init:
  578|      1|{
  579|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  580|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  581|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  582|       |
  583|      1|	gobject_class->set_property = vips_object_set_property;
  584|      1|	gobject_class->get_property = vips_object_get_property;
  585|       |
  586|      1|	object_class->nickname = "ppmsave";
  587|      1|	object_class->description = _("save image to ppm file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  588|      1|	object_class->build = vips_foreign_save_ppm_file_build;
  589|       |
  590|      1|	foreign_class->suffs = vips__ppm_suffs;
  591|       |
  592|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  593|      1|		_("Filename"),
  594|      1|		_("Filename to save to"),
  595|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  596|      1|		G_STRUCT_OFFSET(VipsForeignSavePpmFile, filename),
  597|      1|		NULL);
  598|      1|}
ppmsave.c:vips_foreign_save_ppm_target_class_init:
  635|      1|{
  636|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  637|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  638|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  639|       |
  640|      1|	gobject_class->set_property = vips_object_set_property;
  641|      1|	gobject_class->get_property = vips_object_get_property;
  642|       |
  643|      1|	object_class->nickname = "ppmsave_target";
  644|      1|	object_class->build = vips_foreign_save_ppm_target_build;
  645|       |
  646|      1|	foreign_class->suffs = vips__save_ppm_suffs;
  647|       |
  648|      1|	VIPS_ARG_OBJECT(class, "target", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  649|      1|		_("Target"),
  650|      1|		_("Target to save to"),
  651|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  652|      1|		G_STRUCT_OFFSET(VipsForeignSavePpmTarget, target),
  653|      1|		VIPS_TYPE_TARGET);
  654|      1|}
ppmsave.c:vips_foreign_save_pbm_target_class_init:
  670|      1|{
  671|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  672|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  673|      1|	VipsOperationClass *operation_class = (VipsOperationClass *) class;
  674|       |
  675|      1|	object_class->nickname = "pbmsave_target";
  676|      1|	object_class->description = _("save image in pbm format");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  677|       |
  678|      1|	foreign_class->suffs = vips__save_pbm_suffs;
  679|       |
  680|       |	/* Hide from UI.
  681|       |	 */
  682|      1|	operation_class->flags |= VIPS_OPERATION_DEPRECATED;
  683|      1|}
ppmsave.c:vips_foreign_save_pgm_target_class_init:
  702|      1|{
  703|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  704|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  705|      1|	VipsOperationClass *operation_class = (VipsOperationClass *) class;
  706|       |
  707|      1|	object_class->nickname = "pgmsave_target";
  708|      1|	object_class->description = _("save image in pgm format");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  709|       |
  710|      1|	foreign_class->suffs = vips__save_pgm_suffs;
  711|       |
  712|       |	/* Hide from UI.
  713|       |	 */
  714|      1|	operation_class->flags |= VIPS_OPERATION_DEPRECATED;
  715|      1|}
ppmsave.c:vips_foreign_save_pfm_target_class_init:
  734|      1|{
  735|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  736|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  737|      1|	VipsOperationClass *operation_class = (VipsOperationClass *) class;
  738|       |
  739|      1|	object_class->nickname = "pfmsave_target";
  740|      1|	object_class->description = _("save image in pfm format");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  741|       |
  742|      1|	foreign_class->suffs = vips__save_pfm_suffs;
  743|       |
  744|       |	/* Hide from UI.
  745|       |	 */
  746|      1|	operation_class->flags |= VIPS_OPERATION_DEPRECATED;
  747|      1|}
ppmsave.c:vips_foreign_save_pnm_target_class_init:
  766|      1|{
  767|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  768|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  769|      1|	VipsOperationClass *operation_class = (VipsOperationClass *) class;
  770|       |
  771|      1|	object_class->nickname = "pnmsave_target";
  772|      1|	object_class->description = _("save image in pnm format");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  773|       |
  774|      1|	foreign_class->suffs = vips__save_pnm_suffs;
  775|       |
  776|       |	/* Hide from UI.
  777|       |	 */
  778|      1|	operation_class->flags |= VIPS_OPERATION_DEPRECATED;
  779|      1|}

vips__quantise_attr_create:
   54|  10.9k|{
   55|  10.9k|	return liq_attr_create();
   56|  10.9k|}
vips__quantise_set_max_colors:
   60|  10.9k|{
   61|  10.9k|	return liq_set_max_colors(attr, colors);
   62|  10.9k|}
vips__quantise_set_quality:
   66|  10.9k|{
   67|  10.9k|	return liq_set_quality(attr, minimum, maximum);
   68|  10.9k|}
vips__quantise_set_speed:
   72|  10.9k|{
   73|  10.9k|	return liq_set_speed(attr, speed);
   74|  10.9k|}
vips__quantise_image_create_rgba:
   79|  4.03k|{
   80|  4.03k|	return liq_image_create_rgba(attr, bitmap, width, height, gamma);
   81|  4.03k|}
vips__quantise_image_quantize_fixed:
   96|  4.03k|{
   97|  4.03k|	int i;
   98|  4.03k|	liq_result *result;
   99|  4.03k|	const liq_palette *palette;
  100|  4.03k|	liq_error err;
  101|  4.03k|	liq_image *fake_image;
  102|  4.03k|	char fake_image_pixels[4] = { 0 };
  103|       |
  104|       |	/* First, quantize the image and get its palette.
  105|       |	 */
  106|  4.03k|	err = liq_image_quantize(input_image, options, &result);
  107|  4.03k|	if (err != LIQ_OK)
  ------------------
  |  Branch (107:6): [True: 0, False: 4.03k]
  ------------------
  108|      0|		return err;
  109|       |
  110|  4.03k|	palette = liq_get_palette(result);
  111|       |
  112|       |	/* Now, we need a fake 1 pixel image that will be quantized on the
  113|       |	 * next step. Its pixel color doesn't matter since we'll add all the
  114|       |	 * colors from the palette further.
  115|       |	 */
  116|  4.03k|	fake_image =
  117|  4.03k|		liq_image_create_rgba(options, fake_image_pixels, 1, 1, 0);
  118|  4.03k|	if (!fake_image) {
  ------------------
  |  Branch (118:6): [True: 0, False: 4.03k]
  ------------------
  119|      0|		liq_result_destroy(result);
  120|      0|		return LIQ_OUT_OF_MEMORY;
  121|      0|	}
  122|       |
  123|       |	/* Add all the colors from the palette as fixed colors to the fake
  124|       |	 * image. Since the fixed colors number is the same as required colors
  125|       |	 * number, no new colors will be added.
  126|       |	 */
  127|   225k|	for (i = 0; i < palette->count; i++)
  ------------------
  |  Branch (127:14): [True: 221k, False: 4.03k]
  ------------------
  128|   221k|		liq_image_add_fixed_color(fake_image, palette->entries[i]);
  129|       |
  130|  4.03k|	liq_result_destroy(result);
  131|       |
  132|       |	/* Finally, quantize the fake image with fixed colors to make a
  133|       |	 * VipsQuantiseResult with a fixed palette.
  134|       |	 */
  135|  4.03k|	err = liq_image_quantize(fake_image, options, result_output);
  136|       |
  137|  4.03k|	liq_image_destroy(fake_image);
  138|       |
  139|  4.03k|	return err;
  140|  4.03k|}
vips__quantise_set_dithering_level:
  145|  4.03k|{
  146|  4.03k|	return liq_set_dithering_level(res, dither_level);
  147|  4.03k|}
vips__quantise_get_palette:
  151|  8.06k|{
  152|  8.06k|	return liq_get_palette(result);
  153|  8.06k|}
vips__quantise_write_remapped_image:
  158|  4.03k|{
  159|  4.03k|	return liq_write_remapped_image(
  160|  4.03k|		result, input_image, buffer, buffer_size);
  161|  4.03k|}
vips__quantise_result_destroy:
  165|  4.03k|{
  166|  4.03k|	liq_result_destroy(result);
  167|  4.03k|}
vips__quantise_image_destroy:
  171|  4.03k|{
  172|  4.03k|	liq_image_destroy(img);
  173|  4.03k|}
vips__quantise_attr_destroy:
  177|  10.9k|{
  178|  10.9k|	liq_attr_destroy(attr);
  179|  10.9k|}

vips__rad_israd:
  568|  2.19k|{
  569|  2.19k|	VipsSbuf *sbuf;
  570|  2.19k|	const char *line;
  571|  2.19k|	int result;
  572|       |
  573|       |	/* Just test that the first line is the magic string.
  574|       |	 */
  575|  2.19k|	sbuf = vips_sbuf_new_from_source(source);
  576|  2.19k|	result = (line = vips_sbuf_get_line(sbuf)) &&
  ------------------
  |  Branch (576:11): [True: 2.19k, False: 0]
  ------------------
  577|  2.19k|		strcmp(line, "#?RADIANCE") == 0;
  ------------------
  |  Branch (577:3): [True: 197, False: 2.00k]
  ------------------
  578|  2.19k|	VIPS_UNREF(sbuf);
  ------------------
  |  |   57|  2.19k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  2.19k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  2.19k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  2.19k|	{ \
  |  |  |  |   43|  2.19k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 2.19k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  2.19k|			(void) F((S)); \
  |  |  |  |   45|  2.19k|			(S) = 0; \
  |  |  |  |   46|  2.19k|		} \
  |  |  |  |   47|  2.19k|	} \
  |  |  |  |   48|  2.19k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  2.19k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  579|       |
  580|  2.19k|	return result;
  581|  2.19k|}
vips__rad_header:
  740|    197|{
  741|    197|	Read *read;
  742|       |
  743|    197|	if (!(read = read_new(source, out)))
  ------------------
  |  Branch (743:6): [True: 0, False: 197]
  ------------------
  744|      0|		return -1;
  745|    197|	if (rad2vips_get_header(read, read->out))
  ------------------
  |  Branch (745:6): [True: 95, False: 102]
  ------------------
  746|     95|		return -1;
  747|    102|	vips_source_minimise(source);
  748|       |
  749|    102|	return 0;
  750|    197|}
vips__rad_load:
  787|    102|{
  788|    102|	VipsImage **t = (VipsImage **)
  789|    102|		vips_object_local_array(VIPS_OBJECT(out), 3);
  ------------------
  |  |  433|    102|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    102|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    102|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  790|       |
  791|    102|	Read *read;
  792|       |
  793|       |#ifdef DEBUG
  794|       |	printf("rad2vips: reading \"%s\"\n",
  795|       |		vips_connection_nick(VIPS_CONNECTION(source)));
  796|       |#endif /*DEBUG*/
  797|       |
  798|    102|	if (!(read = read_new(source, out)))
  ------------------
  |  Branch (798:6): [True: 0, False: 102]
  ------------------
  799|      0|		return -1;
  800|       |
  801|    102|	t[0] = vips_image_new();
  802|    102|	if (rad2vips_get_header(read, t[0]))
  ------------------
  |  Branch (802:6): [True: 0, False: 102]
  ------------------
  803|      0|		return -1;
  804|       |
  805|    102|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (805:6): [True: 0, False: 102]
  ------------------
  806|    102|			NULL, rad2vips_generate, NULL, read, NULL) ||
  807|    102|		vips_sequential(t[0], &t[1],
  ------------------
  |  Branch (807:3): [True: 0, False: 102]
  ------------------
  808|    102|			"tile_height", VIPS__FATSTRIP_HEIGHT,
  ------------------
  |  |  161|    102|#define VIPS__FATSTRIP_HEIGHT (16)
  ------------------
  809|    102|			NULL) ||
  810|    102|		vips_image_write(t[1], out))
  ------------------
  |  Branch (810:3): [True: 76, False: 26]
  ------------------
  811|     76|		return -1;
  812|       |
  813|     26|	if (vips_source_decode(source))
  ------------------
  |  Branch (813:6): [True: 0, False: 26]
  ------------------
  814|      0|		return -1;
  815|       |
  816|     26|	return 0;
  817|     26|}
radiance.c:read_new:
  598|    299|{
  599|    299|	Read *read;
  600|    299|	int i;
  601|       |
  602|    299|	if (vips_source_rewind(source))
  ------------------
  |  Branch (602:6): [True: 0, False: 299]
  ------------------
  603|      0|		return NULL;
  604|       |
  605|    299|	if (!(read = VIPS_NEW(out, Read)))
  ------------------
  |  |   70|    299|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    299|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    299|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    299|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    299|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (605:6): [True: 0, False: 299]
  ------------------
  606|      0|		return NULL;
  607|       |
  608|    299|	read->sbuf = vips_sbuf_new_from_source(source);
  609|    299|	read->out = out;
  610|    299|	strcpy(read->format, COLRFMT);
  ------------------
  |  |  202|    299|#define COLRFMT "32-bit_rle_rgbe"
  ------------------
  611|    299|	read->expos = 1.0;
  612|  1.19k|	for (i = 0; i < 3; i++)
  ------------------
  |  Branch (612:14): [True: 897, False: 299]
  ------------------
  613|    897|		read->colcor[i] = 1.0;
  614|    299|	read->aspect = 1.0;
  615|    299|	read->prims[0][0] = CIE_x_r;
  ------------------
  |  |  192|    299|#define CIE_x_r 0.640 /* nominal CRT primaries */
  ------------------
  616|    299|	read->prims[0][1] = CIE_y_r;
  ------------------
  |  |  193|    299|#define CIE_y_r 0.330
  ------------------
  617|    299|	read->prims[1][0] = CIE_x_g;
  ------------------
  |  |  194|    299|#define CIE_x_g 0.290
  ------------------
  618|    299|	read->prims[1][1] = CIE_y_g;
  ------------------
  |  |  195|    299|#define CIE_y_g 0.600
  ------------------
  619|    299|	read->prims[2][0] = CIE_x_b;
  ------------------
  |  |  196|    299|#define CIE_x_b 0.150
  ------------------
  620|    299|	read->prims[2][1] = CIE_y_b;
  ------------------
  |  |  197|    299|#define CIE_y_b 0.060
  ------------------
  621|    299|	read->prims[3][0] = CIE_x_w;
  ------------------
  |  |  198|    299|#define CIE_x_w (1. / 3.) /* use EE white */
  ------------------
  622|    299|	read->prims[3][1] = CIE_y_w;
  ------------------
  |  |  199|    299|#define CIE_y_w (1. / 3.)
  ------------------
  623|       |
  624|    299|	g_signal_connect(out, "close",
  ------------------
  |  |  491|    299|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  625|    299|		G_CALLBACK(read_destroy), read);
  626|    299|	g_signal_connect(out, "minimise",
  ------------------
  |  |  491|    299|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  627|    299|		G_CALLBACK(read_minimise_cb), read);
  628|       |
  629|    299|	return read;
  630|    299|}
radiance.c:read_destroy:
  585|    295|{
  586|    295|	VIPS_UNREF(read->sbuf);
  ------------------
  |  |   57|    295|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|    295|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    295|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    295|	{ \
  |  |  |  |   43|    295|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 295, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|    295|			(void) F((S)); \
  |  |  |  |   45|    295|			(S) = 0; \
  |  |  |  |   46|    295|		} \
  |  |  |  |   47|    295|	} \
  |  |  |  |   48|    295|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    295|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  587|    295|}
radiance.c:read_minimise_cb:
  591|    460|{
  592|    460|	if (read->sbuf)
  ------------------
  |  Branch (592:6): [True: 460, False: 0]
  ------------------
  593|    460|		vips_source_minimise(read->sbuf->source);
  594|    460|}
radiance.c:rad2vips_get_header:
  675|    299|{
  676|    299|	VipsInterpretation interpretation;
  677|    299|	const char *line;
  678|    299|	int width;
  679|    299|	int height;
  680|    299|	int i, j;
  681|       |
  682|    299|	if (getheader(read->sbuf,
  ------------------
  |  Branch (682:6): [True: 63, False: 236]
  ------------------
  683|    299|			(gethfunc *) rad2vips_process_line, read) ||
  684|    299|		!(line = vips_sbuf_get_line(read->sbuf)) ||
  ------------------
  |  Branch (684:3): [True: 6, False: 230]
  ------------------
  685|    299|		!str2resolu(&read->rs, (char *) line)) {
  ------------------
  |  Branch (685:3): [True: 24, False: 206]
  ------------------
  686|     93|		vips_error("rad2vips", "%s",
  687|     93|			_("error reading radiance header"));
  ------------------
  |  |   30|     93|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     93|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  688|     93|		return -1;
  689|     93|	}
  690|       |
  691|    206|	if (strcmp(read->format, COLRFMT) == 0)
  ------------------
  |  |  202|    206|#define COLRFMT "32-bit_rle_rgbe"
  ------------------
  |  Branch (691:6): [True: 206, False: 0]
  ------------------
  692|    206|		interpretation = VIPS_INTERPRETATION_scRGB;
  693|      0|	else if (strcmp(read->format, CIEFMT) == 0)
  ------------------
  |  |  203|      0|#define CIEFMT "32-bit_rle_xyze"
  ------------------
  |  Branch (693:11): [True: 0, False: 0]
  ------------------
  694|      0|		interpretation = VIPS_INTERPRETATION_XYZ;
  695|      0|	else
  696|      0|		interpretation = VIPS_INTERPRETATION_MULTIBAND;
  697|       |
  698|    206|	width = scanlen(&read->rs);
  ------------------
  |  |  251|    206|#define scanlen(rs) ((rs)->rt & YMAJOR ? (rs)->xr : (rs)->yr)
  |  |  ------------------
  |  |  |  |  242|    206|#define YMAJOR 4
  |  |  ------------------
  |  |  |  Branch (251:22): [True: 130, False: 76]
  |  |  ------------------
  ------------------
  699|    206|	height = numscans(&read->rs);
  ------------------
  |  |  252|    206|#define numscans(rs) ((rs)->rt & YMAJOR ? (rs)->yr : (rs)->xr)
  |  |  ------------------
  |  |  |  |  242|    206|#define YMAJOR 4
  |  |  ------------------
  |  |  |  Branch (252:23): [True: 130, False: 76]
  |  |  ------------------
  ------------------
  700|    206|	if (width <= 0 ||
  ------------------
  |  Branch (700:6): [True: 0, False: 206]
  ------------------
  701|    206|		width >= VIPS_MAX_COORD ||
  ------------------
  |  |   69|    412|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (701:3): [True: 2, False: 204]
  ------------------
  702|    206|		height <= 0 ||
  ------------------
  |  Branch (702:3): [True: 0, False: 204]
  ------------------
  703|    206|		height >= VIPS_MAX_COORD) {
  ------------------
  |  |   69|    204|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (703:3): [True: 0, False: 204]
  ------------------
  704|      2|		vips_error("rad2vips", "%s", _("image size out of bounds"));
  ------------------
  |  |   30|      2|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      2|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  705|      2|		return -1;
  706|      2|	}
  707|       |
  708|    204|	vips_image_init_fields(out, width, height, 4,
  709|    204|		VIPS_FORMAT_UCHAR, VIPS_CODING_RAD,
  710|    204|		interpretation,
  711|    204|		1, read->aspect);
  712|       |
  713|    204|	VIPS_SETSTR(out->filename,
  ------------------
  |  |   53|    204|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    204|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|    204|	{ \
  |  |   55|    204|		const char *sst = (V); \
  |  |   56|    204|		\
  |  |   57|    204|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 204, False: 0]
  |  |  ------------------
  |  |   58|    204|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 204]
  |  |  |  Branch (58:16): [True: 204, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|    204|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|    204|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|    204|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|    204|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|    204|	{ \
  |  |  |  |  |  |   43|    204|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 204, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|    204|			(void) F((S)); \
  |  |  |  |  |  |   45|    204|			(S) = 0; \
  |  |  |  |  |  |   46|    204|		} \
  |  |  |  |  |  |   47|    204|	} \
  |  |  |  |  |  |   48|    204|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|    204|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|    204|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 204]
  |  |  ------------------
  |  |   61|    204|					(S) = g_strdup(sst); \
  |  |   62|    204|			} \
  |  |   63|    204|		} \
  |  |   64|    204|	} \
  |  |   65|    204|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    204|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  714|    204|		vips_connection_filename(
  715|    204|			VIPS_CONNECTION(read->sbuf->source)));
  716|       |
  717|    204|	if (vips_image_pipelinev(out, VIPS_DEMAND_STYLE_THINSTRIP, NULL))
  ------------------
  |  Branch (717:6): [True: 0, False: 204]
  ------------------
  718|      0|		return -1;
  719|       |
  720|    204|	vips_image_set_string(out, "rad-format", read->format);
  721|       |
  722|    204|	vips_image_set_double(out, "rad-expos", read->expos);
  723|       |
  724|    816|	for (i = 0; i < 3; i++)
  ------------------
  |  Branch (724:14): [True: 612, False: 204]
  ------------------
  725|    612|		vips_image_set_double(out,
  726|    612|			colcor_name[i], read->colcor[i]);
  727|       |
  728|    204|	vips_image_set_double(out, "rad-aspect", read->aspect);
  729|       |
  730|  1.02k|	for (i = 0; i < 4; i++)
  ------------------
  |  Branch (730:14): [True: 816, False: 204]
  ------------------
  731|  2.44k|		for (j = 0; j < 2; j++)
  ------------------
  |  Branch (731:15): [True: 1.63k, False: 816]
  ------------------
  732|  1.63k|			vips_image_set_double(out,
  733|  1.63k|				prims_name[i][j], read->prims[i][j]);
  734|       |
  735|    204|	return 0;
  736|    204|}
radiance.c:getheader:
  343|    299|{
  344|  11.3k|	for (;;) {
  345|  11.3k|		const char *line;
  346|       |
  347|  11.3k|		if (!(line = vips_sbuf_get_line(sbuf)))
  ------------------
  |  Branch (347:7): [True: 63, False: 11.2k]
  ------------------
  348|     63|			return -1;
  349|  11.2k|		if (strcmp(line, "") == 0)
  ------------------
  |  Branch (349:7): [True: 236, False: 11.0k]
  ------------------
  350|       |			/* Blank line. We've parsed the header successfully.
  351|       |			 */
  352|    236|			break;
  353|       |
  354|  11.0k|		if (f != NULL &&
  ------------------
  |  Branch (354:7): [True: 11.0k, False: 0]
  ------------------
  355|  11.0k|			(*f)((char *) line, p) < 0)
  ------------------
  |  Branch (355:4): [True: 0, False: 11.0k]
  ------------------
  356|      0|			return -1;
  357|  11.0k|	}
  358|       |
  359|    236|	return 0;
  360|    299|}
radiance.c:rad2vips_process_line:
  634|  11.0k|{
  635|  11.0k|	if (isformat(line)) {
  ------------------
  |  |  259|  11.0k|#define isformat(s) formatval(NULL, s)
  |  |  ------------------
  |  |  |  Branch (259:21): [True: 594, False: 10.4k]
  |  |  ------------------
  ------------------
  636|    594|		if (formatval(line, read->format))
  ------------------
  |  Branch (636:7): [True: 0, False: 594]
  ------------------
  637|      0|			return -1;
  638|    594|	}
  639|  10.4k|	else if (isexpos(line)) {
  ------------------
  |  |  208|  10.4k|#define isexpos(hl) (!strncmp(hl, EXPOSSTR, LEXPOSSTR))
  |  |  ------------------
  |  |  |  |  206|  10.4k|#define EXPOSSTR "EXPOSURE="
  |  |  ------------------
  |  |               #define isexpos(hl) (!strncmp(hl, EXPOSSTR, LEXPOSSTR))
  |  |  ------------------
  |  |  |  |  207|  10.4k|#define LEXPOSSTR 9
  |  |  ------------------
  |  |  |  Branch (208:21): [True: 147, False: 10.2k]
  |  |  ------------------
  ------------------
  640|    147|		read->expos *= exposval(line);
  ------------------
  |  |  209|    147|#define exposval(hl) atof((hl) + LEXPOSSTR)
  |  |  ------------------
  |  |  |  |  207|    147|#define LEXPOSSTR 9
  |  |  ------------------
  ------------------
  641|    147|	}
  642|  10.2k|	else if (iscolcor(line)) {
  ------------------
  |  |  231|  10.2k|#define iscolcor(hl) (!strncmp(hl, COLCORSTR, LCOLCORSTR))
  |  |  ------------------
  |  |  |  |  229|  10.2k|#define COLCORSTR "COLORCORR="
  |  |  ------------------
  |  |               #define iscolcor(hl) (!strncmp(hl, COLCORSTR, LCOLCORSTR))
  |  |  ------------------
  |  |  |  |  230|  10.2k|#define LCOLCORSTR 10
  |  |  ------------------
  |  |  |  Branch (231:22): [True: 638, False: 9.64k]
  |  |  ------------------
  ------------------
  643|    638|		COLOR cc;
  644|    638|		int i;
  645|       |
  646|    638|		(void) colcorval(cc, line);
  ------------------
  |  |  232|    638|#define colcorval(cc, hl) sscanf((hl) + LCOLCORSTR, "%f %f %f", \
  |  |  ------------------
  |  |  |  |  230|    638|#define LCOLCORSTR 10
  |  |  ------------------
  |  |  233|    638|	&(cc)[RED], &(cc)[GRN], &(cc)[BLU])
  |  |  ------------------
  |  |  |  |  174|    638|#define RED 0
  |  |  ------------------
  |  |               	&(cc)[RED], &(cc)[GRN], &(cc)[BLU])
  |  |  ------------------
  |  |  |  |  175|    638|#define GRN 1
  |  |  ------------------
  |  |               	&(cc)[RED], &(cc)[GRN], &(cc)[BLU])
  |  |  ------------------
  |  |  |  |  176|    638|#define BLU 2
  |  |  ------------------
  ------------------
  647|  2.55k|		for (i = 0; i < 3; i++)
  ------------------
  |  Branch (647:15): [True: 1.91k, False: 638]
  ------------------
  648|  1.91k|			read->colcor[i] *= cc[i];
  649|    638|	}
  650|  9.64k|	else if (isaspect(line)) {
  ------------------
  |  |  214|  9.64k|#define isaspect(hl) (!strncmp(hl, ASPECTSTR, LASPECTSTR))
  |  |  ------------------
  |  |  |  |  212|  9.64k|#define ASPECTSTR "PIXASPECT="
  |  |  ------------------
  |  |               #define isaspect(hl) (!strncmp(hl, ASPECTSTR, LASPECTSTR))
  |  |  ------------------
  |  |  |  |  213|  9.64k|#define LASPECTSTR 10
  |  |  ------------------
  |  |  |  Branch (214:22): [True: 759, False: 8.88k]
  |  |  ------------------
  ------------------
  651|    759|		read->aspect *= aspectval(line);
  ------------------
  |  |  215|    759|#define aspectval(hl) atof((hl) + LASPECTSTR)
  |  |  ------------------
  |  |  |  |  213|    759|#define LASPECTSTR 10
  |  |  ------------------
  ------------------
  652|    759|	}
  653|  8.88k|	else if (isprims(line)) {
  ------------------
  |  |  220|  8.88k|#define isprims(hl) (!strncmp(hl, PRIMARYSTR, LPRIMARYSTR))
  |  |  ------------------
  |  |  |  |  218|  8.88k|#define PRIMARYSTR "PRIMARIES="
  |  |  ------------------
  |  |               #define isprims(hl) (!strncmp(hl, PRIMARYSTR, LPRIMARYSTR))
  |  |  ------------------
  |  |  |  |  219|  8.88k|#define LPRIMARYSTR 10
  |  |  ------------------
  |  |  |  Branch (220:21): [True: 15, False: 8.86k]
  |  |  ------------------
  ------------------
  654|     15|		(void) primsval(read->prims, line);
  ------------------
  |  |  221|     15|#define primsval(p, hl) (sscanf((hl) + LPRIMARYSTR, \
  |  |  ------------------
  |  |  |  |  219|     15|#define LPRIMARYSTR 10
  |  |  ------------------
  |  |  222|     15|							 "%f %f %f %f %f %f %f %f", \
  |  |  223|     15|							 &(p)[RED][CIEX], &(p)[RED][CIEY], \
  |  |  ------------------
  |  |  |  |  174|     15|#define RED 0
  |  |  ------------------
  |  |               							 &(p)[RED][CIEX], &(p)[RED][CIEY], \
  |  |  ------------------
  |  |  |  |  177|     15|#define CIEX 0 /* or, if input is XYZ... */
  |  |  ------------------
  |  |               							 &(p)[RED][CIEX], &(p)[RED][CIEY], \
  |  |  ------------------
  |  |  |  |  174|     15|#define RED 0
  |  |  ------------------
  |  |               							 &(p)[RED][CIEX], &(p)[RED][CIEY], \
  |  |  ------------------
  |  |  |  |  178|     15|#define CIEY 1
  |  |  ------------------
  |  |  224|     15|							 &(p)[GRN][CIEX], &(p)[GRN][CIEY], \
  |  |  ------------------
  |  |  |  |  175|     15|#define GRN 1
  |  |  ------------------
  |  |               							 &(p)[GRN][CIEX], &(p)[GRN][CIEY], \
  |  |  ------------------
  |  |  |  |  177|     15|#define CIEX 0 /* or, if input is XYZ... */
  |  |  ------------------
  |  |               							 &(p)[GRN][CIEX], &(p)[GRN][CIEY], \
  |  |  ------------------
  |  |  |  |  175|     15|#define GRN 1
  |  |  ------------------
  |  |               							 &(p)[GRN][CIEX], &(p)[GRN][CIEY], \
  |  |  ------------------
  |  |  |  |  178|     15|#define CIEY 1
  |  |  ------------------
  |  |  225|     15|							 &(p)[BLU][CIEX], &(p)[BLU][CIEY], \
  |  |  ------------------
  |  |  |  |  176|     15|#define BLU 2
  |  |  ------------------
  |  |               							 &(p)[BLU][CIEX], &(p)[BLU][CIEY], \
  |  |  ------------------
  |  |  |  |  177|     15|#define CIEX 0 /* or, if input is XYZ... */
  |  |  ------------------
  |  |               							 &(p)[BLU][CIEX], &(p)[BLU][CIEY], \
  |  |  ------------------
  |  |  |  |  176|     15|#define BLU 2
  |  |  ------------------
  |  |               							 &(p)[BLU][CIEX], &(p)[BLU][CIEY], \
  |  |  ------------------
  |  |  |  |  178|     15|#define CIEY 1
  |  |  ------------------
  |  |  226|     15|							 &(p)[WHT][CIEX], &(p)[WHT][CIEY]) == 8)
  |  |  ------------------
  |  |  |  |  181|     15|#define WHT 3	  /* used for RGBPRIMS type */
  |  |  ------------------
  |  |               							 &(p)[WHT][CIEX], &(p)[WHT][CIEY]) == 8)
  |  |  ------------------
  |  |  |  |  177|     15|#define CIEX 0 /* or, if input is XYZ... */
  |  |  ------------------
  |  |               							 &(p)[WHT][CIEX], &(p)[WHT][CIEY]) == 8)
  |  |  ------------------
  |  |  |  |  181|     15|#define WHT 3	  /* used for RGBPRIMS type */
  |  |  ------------------
  |  |               							 &(p)[WHT][CIEX], &(p)[WHT][CIEY]) == 8)
  |  |  ------------------
  |  |  |  |  178|     15|#define CIEY 1
  |  |  ------------------
  ------------------
  655|     15|	}
  656|       |
  657|  11.0k|	return 0;
  658|  11.0k|}
radiance.c:formatval:
  315|  11.6k|{
  316|  11.6k|	const char *cp = FMTSTR;
  317|  11.6k|	char *r = fmt;
  318|       |	/* check against format string */
  319|  25.1k|	while (*cp)
  ------------------
  |  Branch (319:9): [True: 23.7k, False: 1.39k]
  ------------------
  320|  23.7k|		if (*cp++ != *s++)
  ------------------
  |  Branch (320:7): [True: 10.2k, False: 13.5k]
  ------------------
  321|  10.2k|			return 0;
  322|  1.67k|	while (g_ascii_isspace(*s))
  ------------------
  |  |   81|  1.67k|  ((g_ascii_table[(guchar) (c)] & G_ASCII_SPACE) != 0)
  |  |  ------------------
  |  |  |  Branch (81:3): [True: 276, False: 1.39k]
  |  |  ------------------
  ------------------
  323|    276|		s++;
  324|  1.39k|	if (!*s)
  ------------------
  |  Branch (324:6): [True: 802, False: 594]
  ------------------
  325|    802|		return 0;
  326|    594|	if (r == NULL) /* just checking if format? */
  ------------------
  |  Branch (326:6): [True: 594, False: 0]
  ------------------
  327|    594|		return 1;
  328|      0|	do /* copy format ID */
  329|      0|		*r++ = *s++;
  330|      0|	while (*s && r - fmt < MAXFMTLEN - 1);
  ------------------
  |  |  309|      0|#define MAXFMTLEN 64
  ------------------
  |  Branch (330:9): [True: 0, False: 0]
  |  Branch (330:15): [True: 0, False: 0]
  ------------------
  331|       |
  332|      0|	do /* remove trailing white space */
  333|      0|		*r-- = '\0';
  334|      0|	while (r > fmt && g_ascii_isspace(*r));
  ------------------
  |  |   81|      0|  ((g_ascii_table[(guchar) (c)] & G_ASCII_SPACE) != 0)
  |  |  ------------------
  |  |  |  Branch (81:3): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (334:9): [True: 0, False: 0]
  ------------------
  335|       |
  336|      0|	return 1;
  337|    594|}
radiance.c:str2resolu:
  281|    230|{
  282|    230|	register char *xndx, *yndx;
  283|    230|	register char *cp;
  284|       |
  285|    230|	if (buf == NULL)
  ------------------
  |  Branch (285:6): [True: 0, False: 230]
  ------------------
  286|      0|		return 0;
  287|    230|	xndx = yndx = NULL;
  288|  5.56k|	for (cp = buf; *cp; cp++)
  ------------------
  |  Branch (288:17): [True: 5.33k, False: 230]
  ------------------
  289|  5.33k|		if (*cp == 'X')
  ------------------
  |  Branch (289:7): [True: 1.13k, False: 4.20k]
  ------------------
  290|  1.13k|			xndx = cp;
  291|  4.20k|		else if (*cp == 'Y')
  ------------------
  |  Branch (291:12): [True: 332, False: 3.87k]
  ------------------
  292|    332|			yndx = cp;
  293|    230|	if (xndx == NULL || yndx == NULL)
  ------------------
  |  Branch (293:6): [True: 11, False: 219]
  |  Branch (293:22): [True: 5, False: 214]
  ------------------
  294|     16|		return 0;
  295|    214|	rp->rt = 0;
  296|    214|	if (xndx > yndx)
  ------------------
  |  Branch (296:6): [True: 135, False: 79]
  ------------------
  297|    135|		rp->rt |= YMAJOR;
  ------------------
  |  |  242|    135|#define YMAJOR 4
  ------------------
  298|    214|	if (xndx[-1] == '-')
  ------------------
  |  Branch (298:6): [True: 1, False: 213]
  ------------------
  299|      1|		rp->rt |= XDECR;
  ------------------
  |  |  240|      1|#define XDECR 1
  ------------------
  300|    214|	if (yndx[-1] == '-')
  ------------------
  |  Branch (300:6): [True: 3, False: 211]
  ------------------
  301|      3|		rp->rt |= YDECR;
  ------------------
  |  |  241|      3|#define YDECR 2
  ------------------
  302|    214|	if ((rp->xr = atoi(xndx + 1)) <= 0)
  ------------------
  |  Branch (302:6): [True: 4, False: 210]
  ------------------
  303|      4|		return 0;
  304|    210|	if ((rp->yr = atoi(yndx + 1)) <= 0)
  ------------------
  |  Branch (304:6): [True: 4, False: 206]
  ------------------
  305|      4|		return 0;
  306|    206|	return 1;
  307|    210|}
radiance.c:rad2vips_generate:
  755|    156|{
  756|    156|	VipsRect *r = &out_region->valid;
  757|    156|	Read *read = (Read *) a;
  758|       |
  759|    156|	int y;
  760|       |
  761|       |#ifdef DEBUG
  762|       |	printf("rad2vips_generate: line %d, %d rows\n",
  763|       |		r->top, r->height);
  764|       |#endif /*DEBUG*/
  765|       |
  766|    156|	VIPS_GATE_START("rad2vips_generate: work");
  ------------------
  |  |   41|    156|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    156|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|    156|	{ \
  |  |   43|    156|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 156]
  |  |  ------------------
  |  |   44|    156|			vips__thread_gate_start(NAME); \
  |  |   45|    156|	} \
  |  |   46|    156|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    156|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  767|       |
  768|  1.33k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (768:14): [True: 1.25k, False: 80]
  ------------------
  769|  1.25k|		COLR *buf = (COLR *)
  770|  1.25k|			VIPS_REGION_ADDR(out_region, 0, r->top + y);
  ------------------
  |  |  227|  1.25k|	((R)->data + \
  |  |  228|  1.25k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  1.25k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  1.25k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  1.25k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  1.25k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  1.25k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  771|       |
  772|  1.25k|		if (scanline_read(read->sbuf, buf, out_region->im->Xsize)) {
  ------------------
  |  Branch (772:7): [True: 76, False: 1.18k]
  ------------------
  773|     76|			vips_error("rad2vips",
  774|     76|				_("read error line %d"), r->top + y);
  ------------------
  |  |   30|     76|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     76|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  775|     76|			VIPS_GATE_STOP("rad2vips_generate: work");
  ------------------
  |  |   49|     76|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     76|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|     76|	{ \
  |  |   51|     76|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 76]
  |  |  ------------------
  |  |   52|     76|			vips__thread_gate_stop(NAME); \
  |  |   53|     76|	} \
  |  |   54|     76|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     76|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  776|     76|			return -1;
  777|     76|		}
  778|  1.25k|	}
  779|       |
  780|    156|	VIPS_GATE_STOP("rad2vips_generate: work");
  ------------------
  |  |   49|     80|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     80|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|     80|	{ \
  |  |   51|     80|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 80]
  |  |  ------------------
  |  |   52|     80|			vips__thread_gate_stop(NAME); \
  |  |   53|     80|	} \
  |  |   54|    156|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    156|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  781|       |
  782|     80|	return 0;
  783|    156|}
radiance.c:scanline_read:
  413|  1.25k|{
  414|  1.25k|	int i, j;
  415|       |
  416|       |	/* Detect old-style scanlines.
  417|       |	 */
  418|  1.25k|	if (width < MINELEN ||
  ------------------
  |  |  235|  2.51k|#define MINELEN 8	   /* minimum scanline length for encoding */
  ------------------
  |  Branch (418:6): [True: 243, False: 1.01k]
  ------------------
  419|  1.25k|		width > MAXELEN)
  ------------------
  |  |  236|  1.01k|#define MAXELEN 0x7fff /* maximum scanline length for encoding */
  ------------------
  |  Branch (419:3): [True: 0, False: 1.01k]
  ------------------
  420|    243|		return scanline_read_old(sbuf, scanline, width);
  421|       |
  422|  1.01k|	if (VIPS_SBUF_REQUIRE(sbuf, 4))
  ------------------
  |  |  123|  1.01k|#define VIPS_SBUF_REQUIRE(S, R) ( \
  |  |  ------------------
  |  |  |  Branch (123:33): [True: 6, False: 1.00k]
  |  |  ------------------
  |  |  124|  1.01k|	(S)->read_point + (R) <= (S)->chars_in_buffer \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 1.00k, False: 7]
  |  |  ------------------
  |  |  125|  1.01k|		? 0 \
  |  |  126|  1.01k|		: vips_sbuf_require((S), (R)))
  ------------------
  423|      6|		return -1;
  424|       |
  425|  1.00k|	if (VIPS_SBUF_PEEK(sbuf)[0] != 2)
  ------------------
  |  |  127|  1.00k|#define VIPS_SBUF_PEEK(S) ((S)->input_buffer + (S)->read_point)
  ------------------
  |  Branch (425:6): [True: 854, False: 154]
  ------------------
  426|    854|		return scanline_read_old(sbuf, scanline, width);
  427|       |
  428|    154|	scanline[0][RED] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  174|    154|#define RED 0
  ------------------
              	scanline[0][RED] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|    154|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  429|    154|	scanline[0][GRN] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  175|    154|#define GRN 1
  ------------------
              	scanline[0][GRN] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|    154|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  430|    154|	scanline[0][BLU] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  176|    154|#define BLU 2
  ------------------
              	scanline[0][BLU] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|    154|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  431|    154|	scanline[0][EXP] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  179|    154|#define EXP 3	  /* exponent same for either format */
  ------------------
              	scanline[0][EXP] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|    154|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  432|    154|	if (scanline[0][GRN] != 2 ||
  ------------------
  |  |  175|    154|#define GRN 1
  ------------------
  |  Branch (432:6): [True: 22, False: 132]
  ------------------
  433|    154|		scanline[0][BLU] & 128)
  ------------------
  |  |  176|    132|#define BLU 2
  ------------------
  |  Branch (433:3): [True: 10, False: 122]
  ------------------
  434|     32|		return scanline_read_old(sbuf,
  435|     32|			scanline + 1, width - 1);
  436|       |
  437|    122|	if (((scanline[0][BLU] << 8) | scanline[0][EXP]) != width) {
  ------------------
  |  |  176|    122|#define BLU 2
  ------------------
              	if (((scanline[0][BLU] << 8) | scanline[0][EXP]) != width) {
  ------------------
  |  |  179|    122|#define EXP 3	  /* exponent same for either format */
  ------------------
  |  Branch (437:6): [True: 2, False: 120]
  ------------------
  438|      2|		vips_error("rad2vips", "%s", _("scanline length mismatch"));
  ------------------
  |  |   30|      2|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      2|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  439|      2|		return -1;
  440|      2|	}
  441|       |
  442|    513|	for (i = 0; i < 4; i++)
  ------------------
  |  Branch (442:14): [True: 422, False: 91]
  ------------------
  443|   361k|		for (j = 0; j < width;) {
  ------------------
  |  Branch (443:15): [True: 361k, False: 393]
  ------------------
  444|   361k|			int code, len;
  445|   361k|			gboolean run;
  446|       |
  447|   361k|			if (VIPS_SBUF_REQUIRE(sbuf, 2))
  ------------------
  |  |  123|   361k|#define VIPS_SBUF_REQUIRE(S, R) ( \
  |  |  ------------------
  |  |  |  Branch (123:33): [True: 7, False: 361k]
  |  |  ------------------
  |  |  124|   361k|	(S)->read_point + (R) <= (S)->chars_in_buffer \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 361k, False: 93]
  |  |  ------------------
  |  |  125|   361k|		? 0 \
  |  |  126|   361k|		: vips_sbuf_require((S), (R)))
  ------------------
  448|      7|				return -1;
  449|       |
  450|   361k|			code = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|   361k|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  451|   361k|			run = code > 128;
  452|   361k|			len = run ? code & 127 : code;
  ------------------
  |  Branch (452:10): [True: 164, False: 361k]
  ------------------
  453|       |
  454|   361k|			if (j + len > width) {
  ------------------
  |  Branch (454:8): [True: 16, False: 361k]
  ------------------
  455|     16|				vips_error("rad2vips", "%s", _("overrun"));
  ------------------
  |  |   30|     16|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     16|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  456|     16|				return -1;
  457|     16|			}
  458|       |
  459|   361k|			if (run) {
  ------------------
  |  Branch (459:8): [True: 161, False: 361k]
  ------------------
  460|    161|				int val;
  461|       |
  462|    161|				val = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|    161|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  463|  4.05k|				while (len--)
  ------------------
  |  Branch (463:12): [True: 3.89k, False: 161]
  ------------------
  464|  3.89k|					scanline[j++][i] = val;
  465|    161|			}
  466|   361k|			else {
  467|   361k|				if (VIPS_SBUF_REQUIRE(sbuf, len))
  ------------------
  |  |  123|   361k|#define VIPS_SBUF_REQUIRE(S, R) ( \
  |  |  ------------------
  |  |  |  Branch (123:33): [True: 6, False: 361k]
  |  |  ------------------
  |  |  124|   361k|	(S)->read_point + (R) <= (S)->chars_in_buffer \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 361k, False: 9]
  |  |  ------------------
  |  |  125|   361k|		? 0 \
  |  |  126|   361k|		: vips_sbuf_require((S), (R)))
  ------------------
  468|      6|					return -1;
  469|   374k|				while (len--)
  ------------------
  |  Branch (469:12): [True: 13.3k, False: 361k]
  ------------------
  470|  13.3k|					scanline[j++][i] =
  471|  13.3k|						VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|   374k|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  472|   361k|			}
  473|   361k|		}
  474|       |
  475|     91|	return 0;
  476|    120|}
radiance.c:scanline_read_old:
  366|  1.12k|{
  367|  1.12k|	int rshift;
  368|       |
  369|  1.12k|	rshift = 0;
  370|       |
  371|  32.4k|	while (width > 0) {
  ------------------
  |  Branch (371:9): [True: 31.3k, False: 1.09k]
  ------------------
  372|  31.3k|		if (VIPS_SBUF_REQUIRE(sbuf, 4))
  ------------------
  |  |  123|  31.3k|#define VIPS_SBUF_REQUIRE(S, R) ( \
  |  |  ------------------
  |  |  |  Branch (123:33): [True: 38, False: 31.3k]
  |  |  ------------------
  |  |  124|  31.3k|	(S)->read_point + (R) <= (S)->chars_in_buffer \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 31.3k, False: 57]
  |  |  ------------------
  |  |  125|  31.3k|		? 0 \
  |  |  126|  31.3k|		: vips_sbuf_require((S), (R)))
  ------------------
  373|     38|			return -1;
  374|       |
  375|  31.3k|		scanline[0][RED] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  174|  31.3k|#define RED 0
  ------------------
              		scanline[0][RED] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|  31.3k|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  376|  31.3k|		scanline[0][GRN] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  175|  31.3k|#define GRN 1
  ------------------
              		scanline[0][GRN] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|  31.3k|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  377|  31.3k|		scanline[0][BLU] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  176|  31.3k|#define BLU 2
  ------------------
              		scanline[0][BLU] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|  31.3k|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  378|  31.3k|		scanline[0][EXP] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  179|  31.3k|#define EXP 3	  /* exponent same for either format */
  ------------------
              		scanline[0][EXP] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|  31.3k|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  379|       |
  380|  31.3k|		if (scanline[0][RED] == 1 &&
  ------------------
  |  |  174|  31.3k|#define RED 0
  ------------------
  |  Branch (380:7): [True: 2.19k, False: 29.1k]
  ------------------
  381|  31.3k|			scanline[0][GRN] == 1 &&
  ------------------
  |  |  175|  2.19k|#define GRN 1
  ------------------
  |  Branch (381:4): [True: 1.26k, False: 933]
  ------------------
  382|  31.3k|			scanline[0][BLU] == 1) {
  ------------------
  |  |  176|  1.26k|#define BLU 2
  ------------------
  |  Branch (382:4): [True: 979, False: 282]
  ------------------
  383|    979|			guint i;
  384|       |
  385|    979|			for (i = ((guint32) scanline[0][EXP] << rshift);
  ------------------
  |  |  179|    979|#define EXP 3	  /* exponent same for either format */
  ------------------
  386|  6.11k|				 i > 0 && width > 0; i--) {
  ------------------
  |  Branch (386:6): [True: 5.43k, False: 673]
  |  Branch (386:15): [True: 5.13k, False: 306]
  ------------------
  387|  5.13k|				copycolr(scanline[0], scanline[-1]);
  ------------------
  |  |  189|  5.13k|#define copycolr(c1, c2) (c1[0] = c2[0], c1[1] = c2[1], \
  |  |  190|  5.13k|	c1[2] = c2[2], c1[3] = c2[3])
  ------------------
  388|  5.13k|				scanline += 1;
  389|  5.13k|				width -= 1;
  390|  5.13k|			}
  391|       |
  392|    979|			rshift += 8;
  393|       |
  394|       |			/* This can happen with badly-formed input files.
  395|       |			 */
  396|    979|			if (rshift > 24)
  ------------------
  |  Branch (396:8): [True: 1, False: 978]
  ------------------
  397|      1|				return -1;
  398|    979|		}
  399|  30.3k|		else {
  400|  30.3k|			scanline += 1;
  401|  30.3k|			width -= 1;
  402|  30.3k|			rshift = 0;
  403|  30.3k|		}
  404|  31.3k|	}
  405|       |
  406|  1.09k|	return 0;
  407|  1.12k|}

radload.c:vips_foreign_load_rad_class_init:
  115|      1|{
  116|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  117|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  118|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  119|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  120|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  121|       |
  122|      1|	gobject_class->dispose = vips_foreign_load_rad_dispose;
  123|       |
  124|      1|	object_class->nickname = "radload_base";
  125|      1|	object_class->description = _("load rad base class");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  126|       |
  127|       |	/* You're unlikely to want to use this on untrusted files.
  128|       |	 */
  129|      1|	operation_class->flags |= VIPS_OPERATION_UNTRUSTED;
  130|       |
  131|       |	/* is_a() is not that quick ... lower the priority.
  132|       |	 */
  133|      1|	foreign_class->priority = -50;
  134|       |
  135|      1|	load_class->get_flags_filename =
  136|      1|		vips_foreign_load_rad_get_flags_filename;
  137|      1|	load_class->get_flags = vips_foreign_load_rad_get_flags;
  138|      1|	load_class->header = vips_foreign_load_rad_header;
  139|      1|	load_class->load = vips_foreign_load_rad_load;
  140|      1|}
radload.c:vips_foreign_load_rad_dispose:
   71|    195|{
   72|    195|	VipsForeignLoadRad *rad = (VipsForeignLoadRad *) gobject;
   73|       |
   74|    195|	VIPS_UNREF(rad->source);
  ------------------
  |  |   57|    195|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|    195|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    195|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    195|	{ \
  |  |  |  |   43|    195|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 195, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|    195|			(void) F((S)); \
  |  |  |  |   45|    195|			(S) = 0; \
  |  |  |  |   46|    195|		} \
  |  |  |  |   47|    195|	} \
  |  |  |  |   48|    195|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    195|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|       |
   76|    195|	G_OBJECT_CLASS(vips_foreign_load_rad_parent_class)->dispose(gobject);
  ------------------
  |  |   58|    195|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|    195|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    195|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   77|    195|}
radload.c:vips_foreign_load_rad_get_flags:
   81|    197|{
   82|    197|	return VIPS_FOREIGN_SEQUENTIAL;
   83|    197|}
radload.c:vips_foreign_load_rad_header:
   93|    197|{
   94|    197|	VipsForeignLoadRad *rad = (VipsForeignLoadRad *) load;
   95|       |
   96|    197|	if (vips__rad_header(rad->source, load->out))
  ------------------
  |  Branch (96:6): [True: 95, False: 102]
  ------------------
   97|     95|		return -1;
   98|       |
   99|    102|	return 0;
  100|    197|}
radload.c:vips_foreign_load_rad_load:
  104|    102|{
  105|    102|	VipsForeignLoadRad *rad = (VipsForeignLoadRad *) load;
  106|       |
  107|    102|	if (vips__rad_load(rad->source, load->real))
  ------------------
  |  Branch (107:6): [True: 76, False: 26]
  ------------------
  108|     76|		return -1;
  109|       |
  110|     26|	return 0;
  111|    102|}
radload.c:vips_foreign_load_rad_init:
  144|    197|{
  145|    197|}
radload.c:vips_foreign_load_rad_source_class_init:
  187|      1|{
  188|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  190|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  191|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  192|       |
  193|      1|	gobject_class->set_property = vips_object_set_property;
  194|      1|	gobject_class->get_property = vips_object_get_property;
  195|       |
  196|      1|	object_class->nickname = "radload_source";
  197|      1|	object_class->description = _("load rad from source");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  198|      1|	object_class->build = vips_foreign_load_rad_source_build;
  199|       |
  200|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  201|       |
  202|      1|	load_class->is_a_source = vips_foreign_load_rad_source_is_a_source;
  203|       |
  204|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  205|      1|		_("Source"),
  206|      1|		_("Source to load from"),
  207|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  208|      1|		G_STRUCT_OFFSET(VipsForeignLoadRadSource, source),
  209|      1|		VIPS_TYPE_SOURCE);
  210|      1|}
radload.c:vips_foreign_load_rad_source_is_a_source:
  181|  2.19k|{
  182|  2.19k|	return vips__rad_israd(source);
  183|  2.19k|}
radload.c:vips_foreign_load_rad_file_class_init:
  263|      1|{
  264|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  265|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  266|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  267|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  268|       |
  269|      1|	gobject_class->set_property = vips_object_set_property;
  270|      1|	gobject_class->get_property = vips_object_get_property;
  271|       |
  272|      1|	object_class->nickname = "radload";
  273|      1|	object_class->description = _("load a Radiance image from a file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  274|      1|	object_class->build = vips_foreign_load_rad_file_build;
  275|       |
  276|      1|	foreign_class->suffs = vips__rad_suffs;
  277|       |
  278|      1|	load_class->is_a = vips_foreign_load_rad_file_is_a;
  279|       |
  280|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  281|      1|		_("Filename"),
  282|      1|		_("Filename to load from"),
  283|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  284|      1|		G_STRUCT_OFFSET(VipsForeignLoadRadFile, filename),
  285|      1|		NULL);
  286|      1|}
radload.c:vips_foreign_load_rad_buffer_class_init:
  341|      1|{
  342|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  343|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  344|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  345|       |
  346|      1|	gobject_class->set_property = vips_object_set_property;
  347|      1|	gobject_class->get_property = vips_object_get_property;
  348|       |
  349|      1|	object_class->nickname = "radload_buffer";
  350|      1|	object_class->description = _("load rad from buffer");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  351|      1|	object_class->build = vips_foreign_load_rad_buffer_build;
  352|       |
  353|      1|	load_class->is_a_buffer = vips_foreign_load_rad_buffer_is_a_buffer;
  354|       |
  355|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  356|      1|		_("Buffer"),
  357|      1|		_("Buffer to load from"),
  358|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  359|      1|		G_STRUCT_OFFSET(VipsForeignLoadRadBuffer, blob),
  360|      1|		VIPS_TYPE_BLOB);
  361|      1|}
radload.c:vips_foreign_load_rad_buffer_build:
  309|    197|{
  310|    197|	VipsForeignLoadRad *rad = (VipsForeignLoadRad *) object;
  311|    197|	VipsForeignLoadRadBuffer *buffer = (VipsForeignLoadRadBuffer *) object;
  312|       |
  313|    197|	if (buffer->blob &&
  ------------------
  |  Branch (313:6): [True: 197, False: 0]
  ------------------
  314|    197|		!(rad->source = vips_source_new_from_memory(
  ------------------
  |  Branch (314:3): [True: 0, False: 197]
  ------------------
  315|    197|			  VIPS_AREA(buffer->blob)->data,
  ------------------
  |  |  137|    197|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  316|    197|			  VIPS_AREA(buffer->blob)->length)))
  ------------------
  |  |  137|    197|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  317|      0|		return -1;
  318|       |
  319|    197|	if (VIPS_OBJECT_CLASS(vips_foreign_load_rad_file_parent_class)->build(object))
  ------------------
  |  |  435|    197|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    197|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    197|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (319:6): [True: 95, False: 102]
  ------------------
  320|     95|		return -1;
  321|       |
  322|    102|	return 0;
  323|    197|}
radload.c:vips_foreign_load_rad_buffer_is_a_buffer:
  327|  2.19k|{
  328|  2.19k|	VipsSource *source;
  329|  2.19k|	gboolean result;
  330|       |
  331|  2.19k|	if (!(source = vips_source_new_from_memory(buf, len)))
  ------------------
  |  Branch (331:6): [True: 0, False: 2.19k]
  ------------------
  332|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  333|  2.19k|	result = vips_foreign_load_rad_source_is_a_source(source);
  334|  2.19k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  2.19k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  2.19k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  2.19k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  2.19k|	{ \
  |  |  |  |   43|  2.19k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 2.19k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  2.19k|			(void) F((S)); \
  |  |  |  |   45|  2.19k|			(S) = 0; \
  |  |  |  |   46|  2.19k|		} \
  |  |  |  |   47|  2.19k|	} \
  |  |  |  |   48|  2.19k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  2.19k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  335|       |
  336|  2.19k|	return result;
  337|  2.19k|}
radload.c:vips_foreign_load_rad_buffer_init:
  365|    197|{
  366|    197|}

radsave.c:vips_foreign_save_rad_class_init:
   86|      1|{
   87|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
   88|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
   89|      1|	VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
   90|       |
   91|      1|	object_class->nickname = "radsave_base";
   92|      1|	object_class->description = _("save Radiance");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   93|       |
   94|      1|	foreign_class->suffs = vips__rad_suffs;
   95|       |
   96|      1|	save_class->saveable = VIPS_SAVEABLE_RGB;
   97|      1|	save_class->format_table = vips_foreign_save_rad_format_table;
   98|      1|	save_class->coding[VIPS_CODING_NONE] = FALSE;
  ------------------
  |  |  794|      1|#define	FALSE	(0)
  ------------------
   99|      1|	save_class->coding[VIPS_CODING_RAD] = TRUE;
  ------------------
  |  |  798|      1|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      1|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  100|      1|}
radsave.c:vips_foreign_save_rad_file_class_init:
  142|      1|{
  143|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  145|       |
  146|      1|	gobject_class->set_property = vips_object_set_property;
  147|      1|	gobject_class->get_property = vips_object_get_property;
  148|       |
  149|      1|	object_class->nickname = "radsave";
  150|      1|	object_class->description = _("save image to Radiance file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  151|      1|	object_class->build = vips_foreign_save_rad_file_build;
  152|       |
  153|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  154|      1|		_("Filename"),
  155|      1|		_("Filename to save to"),
  156|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  157|      1|		G_STRUCT_OFFSET(VipsForeignSaveRadFile, filename),
  158|      1|		NULL);
  159|      1|}
radsave.c:vips_foreign_save_rad_target_class_init:
  195|      1|{
  196|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  197|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  198|       |
  199|      1|	gobject_class->set_property = vips_object_set_property;
  200|      1|	gobject_class->get_property = vips_object_get_property;
  201|       |
  202|      1|	object_class->nickname = "radsave_target";
  203|      1|	object_class->description = _("save image to Radiance target");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  204|      1|	object_class->build = vips_foreign_save_rad_target_build;
  205|       |
  206|      1|	VIPS_ARG_OBJECT(class, "target", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  207|      1|		_("Target"),
  208|      1|		_("Target to save to"),
  209|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  210|      1|		G_STRUCT_OFFSET(VipsForeignSaveRadTarget, target),
  211|      1|		VIPS_TYPE_TARGET);
  212|      1|}
radsave.c:vips_foreign_save_rad_buffer_class_init:
  261|      1|{
  262|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  263|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  264|       |
  265|      1|	gobject_class->set_property = vips_object_set_property;
  266|      1|	gobject_class->get_property = vips_object_get_property;
  267|       |
  268|      1|	object_class->nickname = "radsave_buffer";
  269|      1|	object_class->description = _("save image to Radiance buffer");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  270|      1|	object_class->build = vips_foreign_save_rad_buffer_build;
  271|       |
  272|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  273|      1|		_("Buffer"),
  274|      1|		_("Buffer to save to"),
  275|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  276|      1|		G_STRUCT_OFFSET(VipsForeignSaveRadBuffer, buf),
  277|      1|		VIPS_TYPE_BLOB);
  278|      1|}

rawload.c:vips_foreign_load_raw_class_init:
  117|      1|{
  118|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  119|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  120|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  121|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  122|       |
  123|      1|	gobject_class->set_property = vips_object_set_property;
  124|      1|	gobject_class->get_property = vips_object_get_property;
  125|       |
  126|       |	/* You're unlikely to want to use this on untrusted files.
  127|       |	 */
  128|      1|	operation_class->flags |= VIPS_OPERATION_UNTRUSTED;
  129|       |
  130|      1|	object_class->nickname = "rawload";
  131|      1|	object_class->description = _("load raw data from a file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  132|       |
  133|      1|	load_class->get_flags = vips_foreign_load_raw_get_flags;
  134|      1|	load_class->get_flags_filename =
  135|      1|		vips_foreign_load_raw_get_flags_filename;
  136|      1|	load_class->header = vips_foreign_load_raw_header;
  137|       |
  138|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  139|      1|		_("Filename"),
  140|      1|		_("Filename to load from"),
  141|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  142|      1|		G_STRUCT_OFFSET(VipsForeignLoadRaw, filename),
  143|      1|		NULL);
  144|       |
  145|      1|	VIPS_ARG_INT(class, "width", 20,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  146|      1|		_("Width"),
  147|      1|		_("Image width in pixels"),
  148|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  149|      1|		G_STRUCT_OFFSET(VipsForeignLoadRaw, width),
  150|      1|		0, VIPS_MAX_COORD, 0);
  151|       |
  152|      1|	VIPS_ARG_INT(class, "height", 21,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  153|      1|		_("Height"),
  154|      1|		_("Image height in pixels"),
  155|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  156|      1|		G_STRUCT_OFFSET(VipsForeignLoadRaw, height),
  157|      1|		0, VIPS_MAX_COORD, 0);
  158|       |
  159|      1|	VIPS_ARG_INT(class, "bands", 22,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  160|      1|		_("Bands"),
  161|      1|		_("Number of bands in image"),
  162|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  163|      1|		G_STRUCT_OFFSET(VipsForeignLoadRaw, bands),
  164|      1|		0, VIPS_MAX_COORD, 0);
  165|       |
  166|      1|	VIPS_ARG_UINT64(class, "offset", 23,
  ------------------
  |  |  198|      1|	{ \
  |  |  199|      1|		GParamSpec *pspec; \
  |  |  200|      1|\
  |  |  201|      1|		pspec = g_param_spec_uint64((NAME), (LONG), (DESC), \
  |  |  202|      1|			(MIN), (MAX), (VALUE), \
  |  |  203|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  204|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  205|      1|			vips_argument_get_id(), pspec); \
  |  |  206|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  207|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  208|      1|	}
  ------------------
  167|      1|		_("Size of header"),
  168|      1|		_("Offset in bytes from start of file"),
  169|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  170|      1|		G_STRUCT_OFFSET(VipsForeignLoadRaw, offset),
  171|      1|		0, 100000000000, 0);
  172|       |
  173|      1|	VIPS_ARG_ENUM(class, "format", 24,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  174|      1|		_("Format"),
  175|      1|		_("Pixel format in image"),
  176|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  177|      1|		G_STRUCT_OFFSET(VipsForeignLoadRaw, format),
  178|      1|		VIPS_TYPE_BAND_FORMAT, VIPS_FORMAT_UCHAR);
  179|       |
  180|      1|	VIPS_ARG_ENUM(class, "interpretation", 25,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  181|      1|		_("Interpretation"),
  182|      1|		_("Pixel interpretation"),
  183|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  184|      1|		G_STRUCT_OFFSET(VipsForeignLoadRaw, interpretation),
  185|      1|		VIPS_TYPE_INTERPRETATION, VIPS_INTERPRETATION_MULTIBAND);
  186|      1|}

rawsave.c:vips_foreign_save_raw_class_init:
  128|      1|{
  129|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  130|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  131|      1|	VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
  132|       |
  133|      1|	gobject_class->dispose = vips_foreign_save_raw_dispose;
  134|      1|	gobject_class->set_property = vips_object_set_property;
  135|      1|	gobject_class->get_property = vips_object_get_property;
  136|       |
  137|      1|	object_class->nickname = "rawsave_base";
  138|      1|	object_class->description = _("save image to raw");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  139|      1|	object_class->build = vips_foreign_save_raw_build;
  140|       |
  141|      1|	save_class->saveable = VIPS_SAVEABLE_ANY;
  142|      1|}
rawsave.c:vips_foreign_save_raw_file_class_init:
  181|      1|{
  182|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  183|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  184|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  185|       |
  186|      1|	gobject_class->set_property = vips_object_set_property;
  187|      1|	gobject_class->get_property = vips_object_get_property;
  188|       |
  189|      1|	object_class->nickname = "rawsave";
  190|      1|	object_class->description = _("save image to raw file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  191|      1|	object_class->build = vips_foreign_save_raw_file_build;
  192|       |
  193|      1|	foreign_class->suffs = vips_foreign_save_raw_suffs;
  194|       |
  195|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  196|      1|		_("Filename"),
  197|      1|		_("Filename to save to"),
  198|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  199|      1|		G_STRUCT_OFFSET(VipsForeignSaveRawFile, filename),
  200|      1|		NULL);
  201|      1|}
rawsave.c:vips_foreign_save_raw_target_class_init:
  237|      1|{
  238|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  239|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  240|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  241|       |
  242|      1|	gobject_class->set_property = vips_object_set_property;
  243|      1|	gobject_class->get_property = vips_object_get_property;
  244|       |
  245|      1|	object_class->nickname = "rawsave_target";
  246|      1|	object_class->description = _("write raw image to target");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  247|      1|	object_class->build = vips_foreign_save_raw_target_build;
  248|       |
  249|      1|	foreign_class->suffs = vips_foreign_save_raw_suffs;
  250|       |
  251|      1|	VIPS_ARG_OBJECT(class, "target", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  252|      1|		_("Target"),
  253|      1|		_("Target to save to"),
  254|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  255|      1|		G_STRUCT_OFFSET(VipsForeignSaveRawTarget, target),
  256|      1|		VIPS_TYPE_TARGET);
  257|      1|}
rawsave.c:vips_foreign_save_raw_buffer_class_init:
  299|      1|{
  300|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  301|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  302|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  303|       |
  304|      1|	gobject_class->set_property = vips_object_set_property;
  305|      1|	gobject_class->get_property = vips_object_get_property;
  306|       |
  307|      1|	object_class->nickname = "rawsave_buffer";
  308|      1|	object_class->description = _("write raw image to buffer");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  309|      1|	object_class->build = vips_foreign_save_raw_buffer_build;
  310|       |
  311|      1|	foreign_class->suffs = vips_foreign_save_raw_suffs;
  312|       |
  313|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  314|      1|		_("Buffer"),
  315|      1|		_("Buffer to save to"),
  316|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  317|      1|		G_STRUCT_OFFSET(VipsForeignSaveRawBuffer, buf),
  318|      1|		VIPS_TYPE_BLOB);
  319|      1|}

spngload.c:vips_foreign_load_png_class_init:
  653|      1|{
  654|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  655|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  656|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  657|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  658|       |
  659|      1|	gobject_class->dispose = vips_foreign_load_png_dispose;
  660|      1|	gobject_class->set_property = vips_object_set_property;
  661|      1|	gobject_class->get_property = vips_object_get_property;
  662|       |
  663|      1|	object_class->nickname = "pngload_base";
  664|      1|	object_class->description = _("load png base class");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  665|       |
  666|       |	/* We are fast at is_a(), so high priority.
  667|       |	 */
  668|      1|	foreign_class->priority = 200;
  669|       |
  670|      1|	load_class->get_flags_filename =
  671|      1|		vips_foreign_load_png_get_flags_filename;
  672|      1|	load_class->get_flags = vips_foreign_load_png_get_flags;
  673|      1|	load_class->header = vips_foreign_load_png_header;
  674|      1|	load_class->load = vips_foreign_load_png_load;
  675|       |
  676|       |#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
  677|       |	VIPS_ARG_BOOL(class, "unlimited", 23,
  678|       |		_("Unlimited"),
  679|       |		_("Remove all denial of service limits"),
  680|       |		VIPS_ARGUMENT_OPTIONAL_INPUT,
  681|       |		G_STRUCT_OFFSET(VipsForeignLoadPng, unlimited),
  682|       |		FALSE);
  683|       |#endif
  684|      1|}
spngload.c:vips_foreign_load_png_dispose:
   90|  1.24k|{
   91|  1.24k|	VipsForeignLoadPng *png = (VipsForeignLoadPng *) gobject;
   92|       |
   93|  1.24k|	VIPS_FREEF(spng_ctx_free, png->ctx);
  ------------------
  |  |   41|  1.24k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.24k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.24k|	{ \
  |  |   43|  1.24k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.24k, False: 0]
  |  |  ------------------
  |  |   44|  1.24k|			(void) F((S)); \
  |  |   45|  1.24k|			(S) = 0; \
  |  |   46|  1.24k|		} \
  |  |   47|  1.24k|	} \
  |  |   48|  1.24k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.24k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   94|  1.24k|	VIPS_UNREF(png->source);
  ------------------
  |  |   57|  1.24k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  1.24k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  1.24k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  1.24k|	{ \
  |  |  |  |   43|  1.24k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 1.24k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  1.24k|			(void) F((S)); \
  |  |  |  |   45|  1.24k|			(S) = 0; \
  |  |  |  |   46|  1.24k|		} \
  |  |  |  |   47|  1.24k|	} \
  |  |  |  |   48|  1.24k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  1.24k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   95|       |
   96|  1.24k|	G_OBJECT_CLASS(vips_foreign_load_png_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  1.24k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.24k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.24k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   97|  1.24k|}
spngload.c:vips_foreign_load_png_get_flags_source:
  123|  1.24k|{
  124|  1.24k|	spng_ctx *ctx;
  125|  1.24k|	struct spng_ihdr ihdr;
  126|  1.24k|	VipsForeignFlags flags;
  127|       |
  128|  1.24k|	ctx = spng_ctx_new(SPNG_CTX_IGNORE_ADLER32);
  129|  1.24k|	spng_set_crc_action(ctx, SPNG_CRC_USE, SPNG_CRC_USE);
  130|  1.24k|	if (vips_source_rewind(source))
  ------------------
  |  Branch (130:6): [True: 0, False: 1.24k]
  ------------------
  131|      0|		return 0;
  132|  1.24k|	spng_set_png_stream(ctx,
  133|  1.24k|		vips_foreign_load_png_stream, source);
  134|  1.24k|	if (spng_get_ihdr(ctx, &ihdr)) {
  ------------------
  |  Branch (134:6): [True: 64, False: 1.17k]
  ------------------
  135|     64|		spng_ctx_free(ctx);
  136|     64|		return 0;
  137|     64|	}
  138|  1.17k|	spng_ctx_free(ctx);
  139|       |
  140|  1.17k|	flags = 0;
  141|  1.17k|	if (ihdr.interlace_method != SPNG_INTERLACE_NONE)
  ------------------
  |  Branch (141:6): [True: 214, False: 965]
  ------------------
  142|    214|		flags |= VIPS_FOREIGN_PARTIAL;
  143|    965|	else
  144|    965|		flags |= VIPS_FOREIGN_SEQUENTIAL;
  145|       |
  146|  1.17k|	return flags;
  147|  1.24k|}
spngload.c:vips_foreign_load_png_stream:
  102|  47.1k|{
  103|  47.1k|	VipsSource *source = VIPS_SOURCE(user);
  ------------------
  |  |  106|  47.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  47.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  47.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|  47.1k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  104|       |
  105|  93.5k|	while (length > 0) {
  ------------------
  |  Branch (105:9): [True: 47.6k, False: 45.8k]
  ------------------
  106|  47.6k|		gint64 bytes_read;
  107|       |
  108|  47.6k|		bytes_read = vips_source_read(source, dest, length);
  109|  47.6k|		if (bytes_read < 0)
  ------------------
  |  Branch (109:7): [True: 0, False: 47.6k]
  ------------------
  110|      0|			return SPNG_IO_ERROR;
  111|  47.6k|		if (bytes_read == 0)
  ------------------
  |  Branch (111:7): [True: 1.32k, False: 46.3k]
  ------------------
  112|  1.32k|			return SPNG_IO_EOF;
  113|       |
  114|  46.3k|		dest = (char *) dest + bytes_read;
  115|  46.3k|		length -= bytes_read;
  116|  46.3k|	}
  117|       |
  118|  45.8k|	return 0;
  119|  47.1k|}
spngload.c:vips_foreign_load_png_get_flags:
  151|  1.24k|{
  152|  1.24k|	VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
  153|       |
  154|  1.24k|	return vips_foreign_load_png_get_flags_source(png->source);
  155|  1.24k|}
spngload.c:vips_foreign_load_png_header:
  332|  1.24k|{
  333|  1.24k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(load);
  ------------------
  |  |  441|  1.24k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  1.24k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  1.24k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  334|  1.24k|	VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
  335|       |
  336|  1.24k|	int flags;
  337|  1.24k|	int error;
  338|  1.24k|	struct spng_trns trns;
  339|       |
  340|       |	/* In non-fail mode, ignore CRC errors.
  341|       |	 */
  342|  1.24k|	flags = 0;
  343|  1.24k|	if (load->fail_on < VIPS_FAIL_ON_ERROR)
  ------------------
  |  Branch (343:6): [True: 1.24k, False: 0]
  ------------------
  344|  1.24k|		flags |= SPNG_CTX_IGNORE_ADLER32;
  345|  1.24k|	png->ctx = spng_ctx_new(flags);
  346|  1.24k|	if (load->fail_on < VIPS_FAIL_ON_ERROR)
  ------------------
  |  Branch (346:6): [True: 1.24k, False: 0]
  ------------------
  347|       |		/* Ignore and don't calculate checksums.
  348|       |		 */
  349|  1.24k|		spng_set_crc_action(png->ctx, SPNG_CRC_USE, SPNG_CRC_USE);
  350|       |
  351|       |	/* Set limits to avoid decompression bombs. Set chunk limits to 60mb
  352|       |	 * -- we've seen 50mb XMP blocks in the wild.
  353|       |	 *
  354|       |	 * No need to test the decoded image size -- the user can do that if
  355|       |	 * they wish.
  356|       |	 */
  357|  1.24k|	if (!png->unlimited) {
  ------------------
  |  Branch (357:6): [True: 1.24k, False: 0]
  ------------------
  358|  1.24k|		spng_set_image_limits(png->ctx,
  359|  1.24k|			VIPS_MAX_COORD, VIPS_MAX_COORD);
  ------------------
  |  |   69|  1.24k|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
              			VIPS_MAX_COORD, VIPS_MAX_COORD);
  ------------------
  |  |   69|  1.24k|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  360|  1.24k|		spng_set_chunk_limits(png->ctx,
  361|  1.24k|			60 * 1024 * 1024, 60 * 1024 * 1024);
  362|  1.24k|	}
  363|       |
  364|  1.24k|	if (vips_source_rewind(png->source))
  ------------------
  |  Branch (364:6): [True: 0, False: 1.24k]
  ------------------
  365|      0|		return -1;
  366|  1.24k|	spng_set_png_stream(png->ctx,
  367|  1.24k|		vips_foreign_load_png_stream, png->source);
  368|  1.24k|	if ((error = spng_get_ihdr(png->ctx, &png->ihdr))) {
  ------------------
  |  Branch (368:6): [True: 82, False: 1.16k]
  ------------------
  369|     82|		vips_error(class->nickname, "%s", spng_strerror(error));
  370|     82|		return -1;
  371|     82|	}
  372|       |
  373|       |#ifdef DEBUG
  374|       |	printf("width: %d\nheight: %d\nbit depth: %d\ncolor type: %d\n",
  375|       |		png->ihdr.width, png->ihdr.height,
  376|       |		png->ihdr.bit_depth, png->ihdr.color_type);
  377|       |	printf("compression method: %d\nfilter method: %d\n"
  378|       |		   "interlace method: %d\n",
  379|       |		png->ihdr.compression_method, png->ihdr.filter_method,
  380|       |		png->ihdr.interlace_method);
  381|       |#endif /*DEBUG*/
  382|       |
  383|       |	/* Just convert to host-endian if nothing else applies.
  384|       |	 */
  385|  1.16k|	png->fmt = SPNG_FMT_PNG;
  386|       |
  387|  1.16k|	switch (png->ihdr.color_type) {
  388|    545|	case SPNG_COLOR_TYPE_INDEXED:
  ------------------
  |  Branch (388:2): [True: 545, False: 616]
  ------------------
  389|    545|		png->bands = 3;
  390|    545|		break;
  391|       |
  392|     38|	case SPNG_COLOR_TYPE_GRAYSCALE_ALPHA:
  ------------------
  |  Branch (392:2): [True: 38, False: 1.12k]
  ------------------
  393|    330|	case SPNG_COLOR_TYPE_GRAYSCALE:
  ------------------
  |  Branch (393:2): [True: 292, False: 869]
  ------------------
  394|    330|		png->bands = 1;
  395|    330|		break;
  396|       |
  397|    118|	case SPNG_COLOR_TYPE_TRUECOLOR:
  ------------------
  |  Branch (397:2): [True: 118, False: 1.04k]
  ------------------
  398|    286|	case SPNG_COLOR_TYPE_TRUECOLOR_ALPHA:
  ------------------
  |  Branch (398:2): [True: 168, False: 993]
  ------------------
  399|    286|		png->bands = 3;
  400|    286|		break;
  401|       |
  402|      0|	default:
  ------------------
  |  Branch (402:2): [True: 0, False: 1.16k]
  ------------------
  403|      0|		vips_error(class->nickname, "%s", _("unknown color type"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  404|      0|		return -1;
  405|  1.16k|	}
  406|       |
  407|       |	/* Set libvips format and interpretation.
  408|       |	 */
  409|  1.16k|	if (png->ihdr.bit_depth > 8) {
  ------------------
  |  Branch (409:6): [True: 290, False: 871]
  ------------------
  410|    290|		if (png->bands < 3)
  ------------------
  |  Branch (410:7): [True: 163, False: 127]
  ------------------
  411|    163|			png->interpretation = VIPS_INTERPRETATION_GREY16;
  412|    127|		else
  413|    127|			png->interpretation = VIPS_INTERPRETATION_RGB16;
  414|       |
  415|    290|		png->format = VIPS_FORMAT_USHORT;
  416|    290|	}
  417|    871|	else {
  418|    871|		if (png->bands < 3)
  ------------------
  |  Branch (418:7): [True: 167, False: 704]
  ------------------
  419|    167|			png->interpretation = VIPS_INTERPRETATION_B_W;
  420|    704|		else
  421|    704|			png->interpretation = VIPS_INTERPRETATION_sRGB;
  422|       |
  423|    871|		png->format = VIPS_FORMAT_UCHAR;
  424|    871|	}
  425|       |
  426|       |	/* Expand palette images.
  427|       |	 */
  428|  1.16k|	if (png->ihdr.color_type == SPNG_COLOR_TYPE_INDEXED)
  ------------------
  |  Branch (428:6): [True: 545, False: 616]
  ------------------
  429|    545|		png->fmt = SPNG_FMT_RGB8;
  430|       |
  431|       |	/* Expand <8 bit images to full bytes.
  432|       |	 */
  433|  1.16k|	if (png->ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE &&
  ------------------
  |  Branch (433:6): [True: 292, False: 869]
  ------------------
  434|  1.16k|		png->ihdr.bit_depth < 8)
  ------------------
  |  Branch (434:3): [True: 141, False: 151]
  ------------------
  435|    141|		png->fmt = SPNG_FMT_G8;
  436|       |
  437|       |	/* Try reading the optional transparency chunk. This will cause all
  438|       |	 * chunks up to the first IDAT to be read in, so it can fail if any
  439|       |	 * chunk has an error.
  440|       |	 */
  441|  1.16k|	error = spng_get_trns(png->ctx, &trns);
  442|  1.16k|	if (error &&
  ------------------
  |  Branch (442:6): [True: 1.10k, False: 53]
  ------------------
  443|  1.16k|		error != SPNG_ECHUNKAVAIL) {
  ------------------
  |  Branch (443:3): [True: 820, False: 288]
  ------------------
  444|    820|		vips_error(class->nickname, "%s", spng_strerror(error));
  445|    820|		return -1;
  446|    820|	}
  447|       |
  448|       |	/* Expand transparency.
  449|       |	 *
  450|       |	 * The _ALPHA types should not have the optional trns chunk (they
  451|       |	 * always have a transparent band), see
  452|       |	 * https://www.w3.org/TR/2003/REC-PNG-20031110/#11tRNS
  453|       |	 *
  454|       |	 * It's quick and safe to call spng_get_trns() again, and we now know
  455|       |	 * it will only fail for no transparency chunk.
  456|       |	 */
  457|    341|	if (png->ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE_ALPHA ||
  ------------------
  |  Branch (457:6): [True: 19, False: 322]
  ------------------
  458|    341|		png->ihdr.color_type == SPNG_COLOR_TYPE_TRUECOLOR_ALPHA)
  ------------------
  |  Branch (458:3): [True: 93, False: 229]
  ------------------
  459|    112|		png->bands += 1;
  460|    229|	else if (!spng_get_trns(png->ctx, &trns)) {
  ------------------
  |  Branch (460:11): [True: 53, False: 176]
  ------------------
  461|     53|		png->bands += 1;
  462|       |
  463|     53|		if (png->ihdr.color_type == SPNG_COLOR_TYPE_TRUECOLOR) {
  ------------------
  |  Branch (463:7): [True: 19, False: 34]
  ------------------
  464|     19|			if (png->ihdr.bit_depth == 16)
  ------------------
  |  Branch (464:8): [True: 0, False: 19]
  ------------------
  465|      0|				png->fmt = SPNG_FMT_RGBA16;
  466|     19|			else
  467|     19|				png->fmt = SPNG_FMT_RGBA8;
  468|     19|		}
  469|     34|		else if (png->ihdr.color_type == SPNG_COLOR_TYPE_INDEXED)
  ------------------
  |  Branch (469:12): [True: 32, False: 2]
  ------------------
  470|     32|			png->fmt = SPNG_FMT_RGBA8;
  471|      2|		else if (png->ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE) {
  ------------------
  |  Branch (471:12): [True: 2, False: 0]
  ------------------
  472|      2|			if (png->ihdr.bit_depth == 16)
  ------------------
  |  Branch (472:8): [True: 0, False: 2]
  ------------------
  473|      0|				png->fmt = SPNG_FMT_GA16;
  474|      2|			else
  475|      2|				png->fmt = SPNG_FMT_GA8;
  476|      2|		}
  477|     53|	}
  478|       |
  479|    341|	vips_source_minimise(png->source);
  480|       |
  481|    341|	if (vips_foreign_load_png_set_header(png, load->out))
  ------------------
  |  Branch (481:6): [True: 0, False: 341]
  ------------------
  482|      0|		return -1;
  483|       |
  484|    341|	return 0;
  485|    341|}
spngload.c:vips_foreign_load_png_set_header:
  207|    675|{
  208|    675|	double xres, yres;
  209|    675|	struct spng_iccp iccp;
  210|    675|	struct spng_exif exif;
  211|    675|	struct spng_phys phys;
  212|    675|	struct spng_bkgd bkgd;
  213|    675|	guint32 n_text;
  214|       |
  215|       |	/* Get resolution. Default to 72 pixels per inch.
  216|       |	 */
  217|    675|	xres = 72.0 / 25.4;
  218|    675|	yres = 72.0 / 25.4;
  219|    675|	if (!spng_get_phys(png->ctx, &phys)) {
  ------------------
  |  Branch (219:6): [True: 355, False: 320]
  ------------------
  220|       |		/* unit 1 means pixels per metre, otherwise unspecified.
  221|       |		 */
  222|    355|		xres = phys.unit_specifier == 1
  ------------------
  |  Branch (222:10): [True: 352, False: 3]
  ------------------
  223|    355|			? phys.ppu_x / 1000.0
  224|    355|			: phys.ppu_x;
  225|    355|		yres = phys.unit_specifier == 1
  ------------------
  |  Branch (225:10): [True: 352, False: 3]
  ------------------
  226|    355|			? phys.ppu_y / 1000.0
  227|    355|			: phys.ppu_y;
  228|    355|	}
  229|       |
  230|    675|	vips_image_init_fields(image,
  231|    675|		png->ihdr.width, png->ihdr.height, png->bands,
  232|    675|		png->format, VIPS_CODING_NONE, png->interpretation,
  233|    675|		xres, yres);
  234|       |
  235|    675|	VIPS_SETSTR(image->filename,
  ------------------
  |  |   53|    675|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    675|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|    675|	{ \
  |  |   55|    675|		const char *sst = (V); \
  |  |   56|    675|		\
  |  |   57|    675|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 675, False: 0]
  |  |  ------------------
  |  |   58|    675|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 675]
  |  |  |  Branch (58:16): [True: 675, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|    675|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|    675|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|    675|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|    675|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|    675|	{ \
  |  |  |  |  |  |   43|    675|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 675, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|    675|			(void) F((S)); \
  |  |  |  |  |  |   45|    675|			(S) = 0; \
  |  |  |  |  |  |   46|    675|		} \
  |  |  |  |  |  |   47|    675|	} \
  |  |  |  |  |  |   48|    675|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|    675|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|    675|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 675]
  |  |  ------------------
  |  |   61|    675|					(S) = g_strdup(sst); \
  |  |   62|    675|			} \
  |  |   63|    675|		} \
  |  |   64|    675|	} \
  |  |   65|    675|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    675|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  236|    675|		vips_connection_filename(VIPS_CONNECTION(png->source)));
  237|       |
  238|    675|	if (vips_image_pipelinev(image, VIPS_DEMAND_STYLE_THINSTRIP, NULL))
  ------------------
  |  Branch (238:6): [True: 0, False: 675]
  ------------------
  239|      0|		return -1;
  240|       |
  241|    675|	if (!spng_get_iccp(png->ctx, &iccp))
  ------------------
  |  Branch (241:6): [True: 34, False: 641]
  ------------------
  242|     34|		vips_image_set_blob_copy(image,
  243|     34|			VIPS_META_ICC_NAME, iccp.profile, iccp.profile_len);
  ------------------
  |  |   78|     34|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  244|       |
  245|    675|	if (!spng_get_text(png->ctx, NULL, &n_text)) {
  ------------------
  |  Branch (245:6): [True: 9, False: 666]
  ------------------
  246|      9|		struct spng_text *text;
  247|       |
  248|       |		/* Very large numbers of text chunks are used in DoS
  249|       |		 * attacks.
  250|       |		 */
  251|      9|		if (!png->unlimited && n_text > MAX_PNG_TEXT_CHUNKS) {
  ------------------
  |  |   40|      9|#define MAX_PNG_TEXT_CHUNKS 50
  ------------------
  |  Branch (251:7): [True: 9, False: 0]
  |  Branch (251:26): [True: 0, False: 9]
  ------------------
  252|      0|			g_warning(_("%d text chunks, only %d text chunks will be loaded"),
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  253|      0|				n_text, MAX_PNG_TEXT_CHUNKS);
  254|      0|			n_text = MAX_PNG_TEXT_CHUNKS;
  ------------------
  |  |   40|      0|#define MAX_PNG_TEXT_CHUNKS 50
  ------------------
  255|      0|		}
  256|       |
  257|      9|		text = VIPS_ARRAY(VIPS_OBJECT(png),
  ------------------
  |  |   72|      9|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|      9|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|      9|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|      9|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|      9|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  258|      9|			n_text, struct spng_text);
  259|      9|		if (!spng_get_text(png->ctx, text, &n_text)) {
  ------------------
  |  Branch (259:7): [True: 9, False: 0]
  ------------------
  260|      9|			guint32 i;
  261|       |
  262|     33|			for (i = 0; i < n_text; i++)
  ------------------
  |  Branch (262:16): [True: 24, False: 9]
  ------------------
  263|       |				/* .text is always a null-terminated C string.
  264|       |				 */
  265|     24|				vips_foreign_load_png_set_text(image,
  266|     24|					i, text[i].keyword, text[i].text);
  267|      9|		}
  268|      9|	}
  269|       |
  270|    675|	if (!spng_get_exif(png->ctx, &exif))
  ------------------
  |  Branch (270:6): [True: 0, False: 675]
  ------------------
  271|      0|		vips_image_set_blob_copy(image, VIPS_META_EXIF_NAME,
  ------------------
  |  |   46|      0|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  272|      0|			exif.data, exif.length);
  273|       |
  274|    675|	vips_image_set_int(image, VIPS_META_BITS_PER_SAMPLE,
  ------------------
  |  |  100|    675|#define VIPS_META_BITS_PER_SAMPLE "bits-per-sample"
  ------------------
  275|    675|		png->ihdr.bit_depth);
  276|       |
  277|    675|	if (png->ihdr.color_type == SPNG_COLOR_TYPE_INDEXED) {
  ------------------
  |  Branch (277:6): [True: 191, False: 484]
  ------------------
  278|       |		/* Deprecated "palette-bit-depth" use "bits-per-sample" instead.
  279|       |		 */
  280|    191|		vips_image_set_int(image,
  281|    191|			"palette-bit-depth", png->ihdr.bit_depth);
  282|       |
  283|    191|		vips_image_set_int(image, VIPS_META_PALETTE, 1);
  ------------------
  |  |  107|    191|#define VIPS_META_PALETTE "palette"
  ------------------
  284|    191|	}
  285|       |
  286|       |	/* Let our caller know. These are very expensive to decode.
  287|       |	 */
  288|    675|	if (png->ihdr.interlace_method != SPNG_INTERLACE_NONE)
  ------------------
  |  Branch (288:6): [True: 255, False: 420]
  ------------------
  289|    255|		vips_image_set_int(image, "interlaced", 1);
  290|       |
  291|    675|	if (!spng_get_bkgd(png->ctx, &bkgd)) {
  ------------------
  |  Branch (291:6): [True: 154, False: 521]
  ------------------
  292|    154|		const int scale =
  293|    154|			image->BandFmt == VIPS_FORMAT_UCHAR ? 1 : 256;
  ------------------
  |  Branch (293:4): [True: 154, False: 0]
  ------------------
  294|       |
  295|    154|		double array[3];
  296|    154|		int n;
  297|       |
  298|    154|		switch (png->ihdr.color_type) {
  299|      2|		case SPNG_COLOR_TYPE_GRAYSCALE:
  ------------------
  |  Branch (299:3): [True: 2, False: 152]
  ------------------
  300|      2|		case SPNG_COLOR_TYPE_GRAYSCALE_ALPHA:
  ------------------
  |  Branch (300:3): [True: 0, False: 154]
  ------------------
  301|      2|			array[0] = bkgd.gray / scale;
  302|      2|			n = 1;
  303|      2|			break;
  304|       |
  305|      0|		case SPNG_COLOR_TYPE_TRUECOLOR:
  ------------------
  |  Branch (305:3): [True: 0, False: 154]
  ------------------
  306|      0|		case SPNG_COLOR_TYPE_TRUECOLOR_ALPHA:
  ------------------
  |  Branch (306:3): [True: 0, False: 154]
  ------------------
  307|      0|			array[0] = bkgd.red / scale;
  308|      0|			array[1] = bkgd.green / scale;
  309|      0|			array[2] = bkgd.blue / scale;
  310|      0|			n = 3;
  311|      0|			break;
  312|       |
  313|    152|		case SPNG_COLOR_TYPE_INDEXED:
  ------------------
  |  Branch (313:3): [True: 152, False: 2]
  ------------------
  314|    152|		default:
  ------------------
  |  Branch (314:3): [True: 0, False: 154]
  ------------------
  315|       |			/* Not sure what to do here. I suppose we should read
  316|       |			 * the palette.
  317|       |			 */
  318|    152|			n = 0;
  319|    152|			break;
  320|    154|		}
  321|       |
  322|    154|		if (n > 0)
  ------------------
  |  Branch (322:7): [True: 2, False: 152]
  ------------------
  323|      2|			vips_image_set_array_double(image, "background",
  324|      2|				array, n);
  325|    154|	}
  326|       |
  327|    675|	return 0;
  328|    675|}
spngload.c:vips_foreign_load_png_set_text:
  177|     24|{
  178|       |#ifdef DEBUG
  179|       |	printf("vips_foreign_load_png_set_text: key %s, value %s\n",
  180|       |		key, value);
  181|       |#endif /*DEBUG*/
  182|       |
  183|     24|	if (strcmp(key, "XML:com.adobe.xmp") == 0) {
  ------------------
  |  Branch (183:6): [True: 0, False: 24]
  ------------------
  184|       |		/* Save as an XMP tag. This must be a BLOB, for compatibility
  185|       |		 * for things like the XMP blob that the tiff loader adds.
  186|       |		 *
  187|       |		 * Note that this will remove the null-termination from the
  188|       |		 * string. We must carefully reattach this.
  189|       |		 */
  190|      0|		vips_image_set_blob_copy(out,
  191|      0|			VIPS_META_XMP_NAME, value, strlen(value));
  ------------------
  |  |   53|      0|#define VIPS_META_XMP_NAME "xmp-data"
  ------------------
  192|      0|	}
  193|     24|	else {
  194|     24|		char name[256];
  195|       |
  196|       |		/* Save as a string comment. Some PNGs have EXIF data as
  197|       |		 * text segments, unfortunately.
  198|       |		 */
  199|     24|		g_snprintf(name, 256, "png-comment-%d-%s", i, key);
  200|       |
  201|     24|		vips_image_set_string(out, name, value);
  202|     24|	}
  203|     24|}
spngload.c:vips_foreign_load_png_load:
  575|    334|{
  576|    334|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(load);
  ------------------
  |  |  441|    334|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    334|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    334|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  577|    334|	VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
  578|    334|	VipsImage **t = (VipsImage **)
  579|    334|		vips_object_local_array(VIPS_OBJECT(load), 3);
  ------------------
  |  |  433|    334|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    334|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    334|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  580|       |
  581|    334|	enum spng_decode_flags flags;
  582|    334|	int error;
  583|       |
  584|    334|	if (vips_source_decode(png->source))
  ------------------
  |  Branch (584:6): [True: 0, False: 334]
  ------------------
  585|      0|		return -1;
  586|       |
  587|       |	/* Decode transparency, if available.
  588|       |	 */
  589|    334|	flags = SPNG_DECODE_TRNS;
  590|       |
  591|    334|	if (png->ihdr.interlace_method != SPNG_INTERLACE_NONE) {
  ------------------
  |  Branch (591:6): [True: 126, False: 208]
  ------------------
  592|       |		/* Arg awful interlaced image. We have to load to a huge mem
  593|       |		 * buffer, then copy to out.
  594|       |		 */
  595|    126|		t[0] = vips_image_new_memory();
  596|    126|		if (vips_foreign_load_png_set_header(png, t[0]) ||
  ------------------
  |  Branch (596:7): [True: 0, False: 126]
  ------------------
  597|    126|			vips_image_write_prepare(t[0]))
  ------------------
  |  Branch (597:4): [True: 0, False: 126]
  ------------------
  598|      0|			return -1;
  599|       |
  600|    126|		if ((error = spng_decode_image(png->ctx,
  ------------------
  |  Branch (600:7): [True: 101, False: 25]
  ------------------
  601|    126|				 VIPS_IMAGE_ADDR(t[0], 0, 0),
  ------------------
  |  |  418|    126|	((I)->data + \
  |  |  419|    126|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|    126|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|    126|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|    126|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|    126|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|    126|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|    126|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  602|    126|				 VIPS_IMAGE_SIZEOF_IMAGE(t[0]),
  ------------------
  |  |  388|    126|	(VIPS_IMAGE_SIZEOF_LINE(I) * (I)->Ysize)
  |  |  ------------------
  |  |  |  |  386|    126|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|    126|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|    126|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  603|    126|				 png->fmt, flags))) {
  604|    101|			vips_error(class->nickname,
  605|    101|				"%s", spng_strerror(error));
  606|    101|			return -1;
  607|    101|		}
  608|       |
  609|       |		/* We've now finished reading the file.
  610|       |		 */
  611|     25|		vips_source_minimise(png->source);
  612|       |
  613|     25|		if (vips_image_write(t[0], load->real))
  ------------------
  |  Branch (613:7): [True: 0, False: 25]
  ------------------
  614|      0|			return -1;
  615|     25|	}
  616|    208|	else {
  617|    208|		t[0] = vips_image_new();
  618|       |
  619|    208|		if (vips_foreign_load_png_set_header(png, t[0]))
  ------------------
  |  Branch (619:7): [True: 0, False: 208]
  ------------------
  620|      0|			return -1;
  621|       |
  622|       |		/* We can decode these progressively.
  623|       |		 */
  624|    208|		flags |= SPNG_DECODE_PROGRESSIVE;
  625|       |
  626|    208|		if ((error = spng_decode_image(png->ctx, NULL, 0,
  ------------------
  |  Branch (626:7): [True: 57, False: 151]
  ------------------
  627|    208|				 png->fmt, flags))) {
  628|     57|			vips_error(class->nickname,
  629|     57|				"%s", spng_strerror(error));
  630|     57|			return -1;
  631|     57|		}
  632|       |
  633|       |		/* Close input immediately at end of read.
  634|       |		 */
  635|    151|		g_signal_connect(t[0], "minimise",
  ------------------
  |  |  491|    151|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  636|    151|			G_CALLBACK(vips_foreign_load_png_minimise), png);
  637|       |
  638|    151|		if (vips_image_generate(t[0],
  ------------------
  |  Branch (638:7): [True: 0, False: 151]
  ------------------
  639|    151|				NULL, vips_foreign_load_png_generate, NULL,
  640|    151|				png, NULL) ||
  641|    151|			vips_sequential(t[0], &t[1],
  ------------------
  |  Branch (641:4): [True: 0, False: 151]
  ------------------
  642|    151|				"tile_height", VIPS__FATSTRIP_HEIGHT,
  ------------------
  |  |  161|    151|#define VIPS__FATSTRIP_HEIGHT (16)
  ------------------
  643|    151|				NULL) ||
  644|    151|			vips_image_write(t[1], load->real))
  ------------------
  |  Branch (644:4): [True: 0, False: 151]
  ------------------
  645|      0|			return -1;
  646|    151|	}
  647|       |
  648|    176|	return 0;
  649|    334|}
spngload.c:vips_foreign_load_png_minimise:
  489|    302|{
  490|    302|	vips_source_minimise(png->source);
  491|    302|}
spngload.c:vips_foreign_load_png_generate:
  496|    641|{
  497|    641|	VipsRect *r = &out_region->valid;
  498|    641|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(a);
  ------------------
  |  |  133|    641|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    641|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    641|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|    641|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
  499|    641|	VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
  500|    641|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(png);
  ------------------
  |  |  441|    641|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    641|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    641|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  501|       |
  502|    641|	int y;
  503|    641|	int error;
  504|       |
  505|       |#ifdef DEBUG
  506|       |	printf("vips_foreign_load_png_generate: line %d, %d rows\n",
  507|       |		r->top, r->height);
  508|       |	printf("vips_foreign_load_png_generate: y_top = %d\n", png->y_pos);
  509|       |#endif /*DEBUG*/
  510|       |
  511|       |	/* We're inside a tilecache where tiles are the full image width, so
  512|       |	 * this should always be true.
  513|       |	 */
  514|    641|	g_assert(r->left == 0);
  ------------------
  |  |  166|    641|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    641|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    641|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  515|    641|	g_assert(r->width == out_region->im->Xsize);
  ------------------
  |  |  166|    641|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    641|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    641|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  516|    641|	g_assert(VIPS_RECT_BOTTOM(r) <= out_region->im->Ysize);
  ------------------
  |  |  166|    641|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    641|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    641|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  517|       |
  518|       |	/* Tiles should always be a strip in height, unless it's the final
  519|       |	 * strip.
  520|       |	 */
  521|    641|	g_assert(r->height ==
  ------------------
  |  |  166|    641|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    641|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    641|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  522|    641|		VIPS_MIN(VIPS__FATSTRIP_HEIGHT, out_region->im->Ysize - r->top));
  523|       |
  524|       |	/* And check that y_pos is correct. It should be, since we are inside
  525|       |	 * a vips_sequential().
  526|       |	 */
  527|    641|	if (r->top != png->y_pos) {
  ------------------
  |  Branch (527:6): [True: 0, False: 641]
  ------------------
  528|      0|		vips_error(class->nickname,
  529|      0|			_("out of order read at line %d"), png->y_pos);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  530|      0|		return -1;
  531|      0|	}
  532|       |
  533|  9.92k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (533:14): [True: 9.28k, False: 641]
  ------------------
  534|       |		/* libspng returns EOI when successfully reading the
  535|       |		 * final line of input.
  536|       |		 */
  537|  9.28k|		error = spng_decode_row(png->ctx,
  538|  9.28k|			VIPS_REGION_ADDR(out_region, 0, r->top + y),
  ------------------
  |  |  227|  9.28k|	((R)->data + \
  |  |  228|  9.28k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  9.28k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  9.28k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  9.28k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  9.28k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  9.28k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  539|  9.28k|			VIPS_REGION_SIZEOF_LINE(out_region));
  ------------------
  |  |  203|  9.28k|	((size_t) ((R)->valid.width * VIPS_REGION_SIZEOF_PEL(R)))
  |  |  ------------------
  |  |  |  |  201|  9.28k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  9.28k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  9.28k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  540|  9.28k|		if (error != 0 &&
  ------------------
  |  Branch (540:7): [True: 3.30k, False: 5.98k]
  ------------------
  541|  9.28k|			error != SPNG_EOI) {
  ------------------
  |  Branch (541:4): [True: 3.27k, False: 25]
  ------------------
  542|       |			/* We've failed to read some pixels. Knock this
  543|       |			 * operation out of cache.
  544|       |			 */
  545|  3.27k|			vips_operation_invalidate(VIPS_OPERATION(png));
  ------------------
  |  |   57|  3.27k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  3.27k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  3.27k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|  3.27k|		VIPS_TYPE_OPERATION, VipsOperation))
  ------------------
  546|       |
  547|       |#ifdef DEBUG
  548|       |			printf("vips_foreign_load_png_generate:\n");
  549|       |			printf("  spng_decode_row() failed, line %d\n",
  550|       |				r->top + y);
  551|       |			printf("  thread %p\n", g_thread_self());
  552|       |			printf("  error %s\n", spng_strerror(error));
  553|       |#endif /*DEBUG*/
  554|       |
  555|  3.27k|			g_warning("%s: %s",
  ------------------
  |  |  338|  3.27k|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  3.27k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|  3.27k|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|  3.27k|                               __VA_ARGS__)
  ------------------
  556|  3.27k|				class->nickname, spng_strerror(error));
  557|       |
  558|       |			/* And bail if trunc is on.
  559|       |			 */
  560|  3.27k|			if (load->fail_on >= VIPS_FAIL_ON_TRUNCATED) {
  ------------------
  |  Branch (560:8): [True: 0, False: 3.27k]
  ------------------
  561|      0|				vips_error(class->nickname,
  562|      0|					"%s", _("libspng read error"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  563|      0|				return -1;
  564|      0|			}
  565|  3.27k|		}
  566|       |
  567|  9.28k|		png->y_pos += 1;
  568|  9.28k|	}
  569|       |
  570|    641|	return 0;
  571|    641|}
spngload.c:vips_foreign_load_png_init:
  688|  1.24k|{
  689|  1.24k|}
spngload.c:vips_foreign_load_png_source_class_init:
  739|      1|{
  740|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  741|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  742|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  743|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  744|       |
  745|      1|	gobject_class->set_property = vips_object_set_property;
  746|      1|	gobject_class->get_property = vips_object_get_property;
  747|       |
  748|      1|	object_class->nickname = "pngload_source";
  749|      1|	object_class->description = _("load png from source");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  750|      1|	object_class->build = vips_foreign_load_png_source_build;
  751|       |
  752|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  753|       |
  754|      1|	load_class->is_a_source = vips_foreign_load_png_source_is_a_source;
  755|       |
  756|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  757|      1|		_("Source"),
  758|      1|		_("Source to load from"),
  759|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  760|      1|		G_STRUCT_OFFSET(VipsForeignLoadPngSource, source),
  761|      1|		VIPS_TYPE_SOURCE);
  762|      1|}
spngload.c:vips_foreign_load_png_source_is_a_source:
  725|  16.7k|{
  726|  16.7k|	static unsigned char signature[8] = { 137, 80, 78, 71, 13, 10, 26, 10 };
  727|       |
  728|  16.7k|	const unsigned char *p;
  729|       |
  730|  16.7k|	if ((p = vips_source_sniff(source, 8)) &&
  ------------------
  |  Branch (730:6): [True: 16.6k, False: 72]
  ------------------
  731|  16.7k|		memcmp(p, signature, 8) == 0)
  ------------------
  |  Branch (731:3): [True: 1.24k, False: 15.4k]
  ------------------
  732|  1.24k|		return TRUE;
  ------------------
  |  |  798|  1.24k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  1.24k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  733|       |
  734|  15.5k|	return FALSE;
  ------------------
  |  |  794|  15.5k|#define	FALSE	(0)
  ------------------
  735|  16.7k|}
spngload.c:vips_foreign_load_png_file_class_init:
  817|      1|{
  818|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  819|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  820|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  821|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  822|       |
  823|      1|	gobject_class->set_property = vips_object_set_property;
  824|      1|	gobject_class->get_property = vips_object_get_property;
  825|       |
  826|      1|	object_class->nickname = "pngload";
  827|      1|	object_class->description = _("load png from file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  828|      1|	object_class->build = vips_foreign_load_png_file_build;
  829|       |
  830|      1|	foreign_class->suffs = vips_foreign_load_png_file_suffs;
  831|       |
  832|      1|	load_class->is_a = vips_foreign_load_png_file_is_a;
  833|       |
  834|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  835|      1|		_("Filename"),
  836|      1|		_("Filename to load from"),
  837|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  838|      1|		G_STRUCT_OFFSET(VipsForeignLoadPngFile, filename),
  839|      1|		NULL);
  840|      1|}
spngload.c:vips_foreign_load_png_buffer_class_init:
  896|      1|{
  897|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  898|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  899|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  900|       |
  901|      1|	gobject_class->set_property = vips_object_set_property;
  902|      1|	gobject_class->get_property = vips_object_get_property;
  903|       |
  904|      1|	object_class->nickname = "pngload_buffer";
  905|      1|	object_class->description = _("load png from buffer");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  906|      1|	object_class->build = vips_foreign_load_png_buffer_build;
  907|       |
  908|      1|	load_class->is_a_buffer = vips_foreign_load_png_buffer_is_a_buffer;
  909|       |
  910|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  911|      1|		_("Buffer"),
  912|      1|		_("Buffer to load from"),
  913|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  914|      1|		G_STRUCT_OFFSET(VipsForeignLoadPngBuffer, blob),
  915|      1|		VIPS_TYPE_BLOB);
  916|      1|}
spngload.c:vips_foreign_load_png_buffer_build:
  863|  1.24k|{
  864|  1.24k|	VipsForeignLoadPng *png = (VipsForeignLoadPng *) object;
  865|  1.24k|	VipsForeignLoadPngBuffer *buffer = (VipsForeignLoadPngBuffer *) object;
  866|       |
  867|  1.24k|	if (buffer->blob &&
  ------------------
  |  Branch (867:6): [True: 1.24k, False: 0]
  ------------------
  868|  1.24k|		!(png->source = vips_source_new_from_memory(
  ------------------
  |  Branch (868:3): [True: 0, False: 1.24k]
  ------------------
  869|  1.24k|			  VIPS_AREA(buffer->blob)->data,
  ------------------
  |  |  137|  1.24k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  870|  1.24k|			  VIPS_AREA(buffer->blob)->length)))
  ------------------
  |  |  137|  1.24k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  871|      0|		return -1;
  872|       |
  873|  1.24k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_png_buffer_parent_class)
  ------------------
  |  |  435|  1.24k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.24k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.24k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (873:6): [True: 902, False: 341]
  ------------------
  874|  1.24k|			->build(object))
  875|    902|		return -1;
  876|       |
  877|    341|	return 0;
  878|  1.24k|}
spngload.c:vips_foreign_load_png_buffer_is_a_buffer:
  882|  16.7k|{
  883|  16.7k|	VipsSource *source;
  884|  16.7k|	gboolean result;
  885|       |
  886|  16.7k|	if (!(source = vips_source_new_from_memory(buf, len)))
  ------------------
  |  Branch (886:6): [True: 0, False: 16.7k]
  ------------------
  887|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  888|  16.7k|	result = vips_foreign_load_png_source_is_a_source(source);
  889|  16.7k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  16.7k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  16.7k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  16.7k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  16.7k|	{ \
  |  |  |  |   43|  16.7k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 16.7k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  16.7k|			(void) F((S)); \
  |  |  |  |   45|  16.7k|			(S) = 0; \
  |  |  |  |   46|  16.7k|		} \
  |  |  |  |   47|  16.7k|	} \
  |  |  |  |   48|  16.7k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  16.7k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  890|       |
  891|  16.7k|	return result;
  892|  16.7k|}
spngload.c:vips_foreign_load_png_buffer_init:
  920|  1.24k|{
  921|  1.24k|}

spngsave.c:vips_foreign_save_spng_class_init:
  670|      1|{
  671|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  672|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  673|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  674|      1|	VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
  675|       |
  676|      1|	gobject_class->dispose = vips_foreign_save_spng_dispose;
  677|      1|	gobject_class->set_property = vips_object_set_property;
  678|      1|	gobject_class->get_property = vips_object_get_property;
  679|       |
  680|      1|	object_class->nickname = "spngsave_base";
  681|      1|	object_class->description = _("save spng");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  682|      1|	object_class->build = vips_foreign_save_spng_build;
  683|       |
  684|      1|	foreign_class->suffs = vips__png_suffs;
  685|       |
  686|      1|	save_class->saveable = VIPS_SAVEABLE_RGBA;
  687|      1|	save_class->format_table = bandfmt_spng;
  688|       |
  689|      1|	VIPS_ARG_INT(class, "compression", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  690|      1|		_("Compression"),
  691|      1|		_("Compression factor"),
  692|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  693|      1|		G_STRUCT_OFFSET(VipsForeignSaveSpng, compression),
  694|      1|		0, 9, 6);
  695|       |
  696|      1|	VIPS_ARG_BOOL(class, "interlace", 7,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  697|      1|		_("Interlace"),
  698|      1|		_("Interlace image"),
  699|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  700|      1|		G_STRUCT_OFFSET(VipsForeignSaveSpng, interlace),
  701|      1|		FALSE);
  702|       |
  703|      1|	VIPS_ARG_FLAGS(class, "filter", 12,
  ------------------
  |  |  226|      1|	{ \
  |  |  227|      1|		GParamSpec *pspec; \
  |  |  228|      1|\
  |  |  229|      1|		pspec = g_param_spec_flags((NAME), (LONG), (DESC), \
  |  |  230|      1|			(TYPE), (VALUE), \
  |  |  231|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  232|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  233|      1|			vips_argument_get_id(), pspec); \
  |  |  234|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  235|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  236|      1|	}
  ------------------
  704|      1|		_("Filter"),
  705|      1|		_("libspng row filter flag(s)"),
  706|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  707|      1|		G_STRUCT_OFFSET(VipsForeignSaveSpng, filter),
  708|      1|		VIPS_TYPE_FOREIGN_PNG_FILTER,
  709|      1|		VIPS_FOREIGN_PNG_FILTER_NONE);
  710|       |
  711|      1|	VIPS_ARG_BOOL(class, "palette", 13,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  712|      1|		_("Palette"),
  713|      1|		_("Quantise to 8bpp palette"),
  714|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  715|      1|		G_STRUCT_OFFSET(VipsForeignSaveSpng, palette),
  716|      1|		FALSE);
  717|       |
  718|      1|	VIPS_ARG_INT(class, "Q", 15,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  719|      1|		_("Quality"),
  720|      1|		_("Quantisation quality"),
  721|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  722|      1|		G_STRUCT_OFFSET(VipsForeignSaveSpng, Q),
  723|      1|		0, 100, 100);
  724|       |
  725|      1|	VIPS_ARG_DOUBLE(class, "dither", 16,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  726|      1|		_("Dithering"),
  727|      1|		_("Amount of dithering"),
  728|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  729|      1|		G_STRUCT_OFFSET(VipsForeignSaveSpng, dither),
  730|      1|		0.0, 1.0, 1.0);
  731|       |
  732|      1|	VIPS_ARG_INT(class, "bitdepth", 17,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  733|      1|		_("Bit depth"),
  734|      1|		_("Write as a 1, 2, 4, 8 or 16 bit image"),
  735|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  736|      1|		G_STRUCT_OFFSET(VipsForeignSaveSpng, bitdepth),
  737|      1|		1, 16, 8);
  738|       |
  739|      1|	VIPS_ARG_INT(class, "effort", 18,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  740|      1|		_("Effort"),
  741|      1|		_("Quantisation CPU effort"),
  742|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  743|      1|		G_STRUCT_OFFSET(VipsForeignSaveSpng, effort),
  744|      1|		1, 10, 7);
  745|       |
  746|      1|	VIPS_ARG_INT(class, "colours", 14,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  747|      1|		_("Colours"),
  748|      1|		_("Max number of palette colours"),
  749|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  750|      1|		G_STRUCT_OFFSET(VipsForeignSaveSpng, colours),
  751|      1|		2, 256, 256);
  752|      1|}
spngsave.c:vips_foreign_save_spng_target_class_init:
  794|      1|{
  795|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  796|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  797|       |
  798|      1|	gobject_class->set_property = vips_object_set_property;
  799|      1|	gobject_class->get_property = vips_object_get_property;
  800|       |
  801|      1|	object_class->nickname = "pngsave_target";
  802|      1|	object_class->description = _("save image to target as PNG");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  803|      1|	object_class->build = vips_foreign_save_spng_target_build;
  804|       |
  805|      1|	VIPS_ARG_OBJECT(class, "target", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  806|      1|		_("Target"),
  807|      1|		_("Target to save to"),
  808|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  809|      1|		G_STRUCT_OFFSET(VipsForeignSaveSpngTarget, target),
  810|      1|		VIPS_TYPE_TARGET);
  811|      1|}
spngsave.c:vips_foreign_save_spng_file_class_init:
  847|      1|{
  848|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  849|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  850|       |
  851|      1|	gobject_class->set_property = vips_object_set_property;
  852|      1|	gobject_class->get_property = vips_object_get_property;
  853|       |
  854|      1|	object_class->nickname = "pngsave";
  855|      1|	object_class->description = _("save image to file as PNG");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  856|      1|	object_class->build = vips_foreign_save_spng_file_build;
  857|       |
  858|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  859|      1|		_("Filename"),
  860|      1|		_("Filename to save to"),
  861|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  862|      1|		G_STRUCT_OFFSET(VipsForeignSaveSpngFile, filename),
  863|      1|		NULL);
  864|      1|}
spngsave.c:vips_foreign_save_spng_buffer_class_init:
  907|      1|{
  908|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  909|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  910|       |
  911|      1|	gobject_class->set_property = vips_object_set_property;
  912|      1|	gobject_class->get_property = vips_object_get_property;
  913|       |
  914|      1|	object_class->nickname = "pngsave_buffer";
  915|      1|	object_class->description = _("save image to buffer as PNG");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  916|      1|	object_class->build = vips_foreign_save_spng_buffer_build;
  917|       |
  918|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  919|      1|		_("Buffer"),
  920|      1|		_("Buffer to save to"),
  921|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  922|      1|		G_STRUCT_OFFSET(VipsForeignSaveSpngBuffer, buf),
  923|      1|		VIPS_TYPE_BLOB);
  924|      1|}

vips__tiff_init:
   64|  24.7k|vips__tiff_init(void) {}
vips__tiff_openin_source:
  168|  24.7k|{
  169|  24.7k|	TIFF *tiff;
  170|       |
  171|       |#ifdef DEBUG
  172|       |	printf("vips__tiff_openin_source:\n");
  173|       |#endif /*DEBUG*/
  174|       |
  175|  24.7k|	if (vips_source_rewind(source))
  ------------------
  |  Branch (175:6): [True: 0, False: 24.7k]
  ------------------
  176|      0|		return NULL;
  177|       |
  178|       |	/* Disable memory mapped input -- it chews up VM and the performance
  179|       |	 * gain is very small.
  180|       |	 *
  181|       |	 * C enables strip chopping: very large uncompressed strips are
  182|       |	 * chopped into c. 8kb chunks. This can reduce peak memory use for
  183|       |	 * this type of file.
  184|       |	 */
  185|       |
  186|  24.7k|#ifdef HAVE_TIFF_OPEN_OPTIONS
  187|  24.7k|	TIFFOpenOptions *opts = TIFFOpenOptionsAlloc();
  188|  24.7k|	TIFFOpenOptionsSetErrorHandlerExtR(opts, error_fn, user_data);
  189|  24.7k|	TIFFOpenOptionsSetWarningHandlerExtR(opts, warning_fn, user_data);
  190|  24.7k|#ifdef HAVE_TIFF_OPEN_OPTIONS_SET_MAX_CUMULATED_MEM_ALLOC
  191|  24.7k|	if (!unlimited) {
  ------------------
  |  Branch (191:6): [True: 24.7k, False: 0]
  ------------------
  192|  24.7k|		TIFFOpenOptionsSetMaxCumulatedMemAlloc(opts, 20 * 1024 * 1024);
  193|  24.7k|	}
  194|  24.7k|#endif /*HAVE_TIFF_OPEN_OPTIONS_SET_MAX_CUMULATED_MEM_ALLOC*/
  195|  24.7k|	if (!(tiff = TIFFClientOpenExt("source input", "rmC",
  ------------------
  |  Branch (195:6): [True: 6.36k, False: 18.3k]
  ------------------
  196|  24.7k|			  (thandle_t) source,
  197|  24.7k|			  openin_source_read,
  198|  24.7k|			  openin_source_write,
  199|  24.7k|			  openin_source_seek,
  200|  24.7k|			  openin_source_close,
  201|  24.7k|			  openin_source_length,
  202|  24.7k|			  openin_source_map,
  203|  24.7k|			  openin_source_unmap,
  204|  24.7k|			  opts))) {
  205|  6.36k|	    TIFFOpenOptionsFree(opts);
  206|  6.36k|		vips_error("vips__tiff_openin_source", "%s",
  207|  6.36k|			_("unable to open source for input"));
  ------------------
  |  |   30|  6.36k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  6.36k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  208|  6.36k|		return NULL;
  209|  6.36k|	}
  210|  18.3k|	TIFFOpenOptionsFree(opts);
  211|       |#else
  212|       |	if (!(tiff = TIFFClientOpen("source input", "rmC",
  213|       |			  (thandle_t) source,
  214|       |			  openin_source_read,
  215|       |			  openin_source_write,
  216|       |			  openin_source_seek,
  217|       |			  openin_source_close,
  218|       |			  openin_source_length,
  219|       |			  openin_source_map,
  220|       |			  openin_source_unmap))) {
  221|       |		vips_error("vips__tiff_openin_source", "%s",
  222|       |			_("unable to open source for input"));
  223|       |		return NULL;
  224|       |	}
  225|       |#endif /*HAVE_TIFF_OPEN_OPTIONS*/
  226|       |
  227|       |	/* Unreffed on close(), see above.
  228|       |	 */
  229|  18.3k|	g_object_ref(source);
  230|       |
  231|  18.3k|	return tiff;
  232|  24.7k|}
tiff.c:openin_source_read:
  104|   301k|{
  105|   301k|	VipsSource *source = VIPS_SOURCE(st);
  ------------------
  |  |  106|   301k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   301k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   301k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|   301k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  106|       |
  107|   301k|	return vips_source_read(source, data, size);
  108|   301k|}
tiff.c:openin_source_seek:
  120|   244k|{
  121|   244k|	VipsSource *source = VIPS_SOURCE(st);
  ------------------
  |  |  106|   244k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   244k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   244k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|   244k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  122|       |
  123|   244k|	return (toff_t) vips_source_seek(source, offset, whence);
  124|   244k|}
tiff.c:openin_source_close:
  128|  18.3k|{
  129|  18.3k|	VipsSource *source = VIPS_SOURCE(st);
  ------------------
  |  |  106|  18.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  18.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  18.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|  18.3k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  130|       |
  131|  18.3k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  18.3k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  18.3k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  18.3k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  18.3k|	{ \
  |  |  |  |   43|  18.3k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 18.3k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  18.3k|			(void) F((S)); \
  |  |  |  |   45|  18.3k|			(S) = 0; \
  |  |  |  |   46|  18.3k|		} \
  |  |  |  |   47|  18.3k|	} \
  |  |  |  |   48|  18.3k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  18.3k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|       |
  133|  18.3k|	return 0;
  134|  18.3k|}
tiff.c:openin_source_length:
  138|  29.0k|{
  139|  29.0k|	VipsSource *source = VIPS_SOURCE(st);
  ------------------
  |  |  106|  29.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  29.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  29.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|  29.0k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  140|       |
  141|       |	/* libtiff will use this to get file size if tags like StripByteCounts
  142|       |	 * are missing.
  143|       |	 *
  144|       |	 * toff_t is usually uint64, with -1 cast to uint64 to indicate error.
  145|       |	 */
  146|  29.0k|	return (toff_t) vips_source_length(source);
  147|  29.0k|}

vips__istiff_source:
 3453|  11.2k|{
 3454|  11.2k|	return vips__testtiff_source(source, NULL);
 3455|  11.2k|}
vips__istifftiled_source:
 3459|  4.86k|{
 3460|  4.86k|	return vips__testtiff_source(source, TIFFIsTiled);
 3461|  4.86k|}
vips__tiff_read_header_source:
 3467|  4.86k|{
 3468|  4.86k|	Rtiff *rtiff;
 3469|       |
 3470|  4.86k|	vips__tiff_init();
 3471|       |
 3472|  4.86k|	if (!(rtiff = rtiff_new(source, out,
  ------------------
  |  Branch (3472:6): [True: 0, False: 4.86k]
  ------------------
 3473|  4.86k|			  page, n, autorotate, subifd, fail_on, unlimited)) ||
 3474|  4.86k|		rtiff_header_read_all(rtiff))
  ------------------
  |  Branch (3474:3): [True: 779, False: 4.08k]
  ------------------
 3475|    779|		return -1;
 3476|       |
 3477|  4.08k|	if (rtiff_set_header(rtiff, out))
  ------------------
  |  Branch (3477:6): [True: 150, False: 3.93k]
  ------------------
 3478|    150|		return -1;
 3479|       |
 3480|  3.93k|	if (rtiff->autorotate &&
  ------------------
  |  Branch (3480:6): [True: 0, False: 3.93k]
  ------------------
 3481|  3.93k|		vips_image_get_orientation_swap(out)) {
  ------------------
  |  Branch (3481:3): [True: 0, False: 0]
  ------------------
 3482|      0|		VIPS_SWAP(int, out->Xsize, out->Ysize);
  ------------------
  |  |  114|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |  115|      0|	{ \
  |  |  116|      0|		TYPE t = (A); \
  |  |  117|      0|		(A) = (B); \
  |  |  118|      0|		(B) = t; \
  |  |  119|      0|	} \
  |  |  120|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3483|      0|		vips_autorot_remove_angle(out);
 3484|      0|	}
 3485|       |
 3486|       |	/* We never call vips_source_decode() since we need to be able to
 3487|       |	 * seek() the whole way through the file. Just minimise instead,
 3488|       |	 */
 3489|  3.93k|	vips_source_minimise(source);
 3490|       |
 3491|  3.93k|	return 0;
 3492|  4.08k|}
vips__tiff_read_source:
 3498|  3.74k|{
 3499|  3.74k|	Rtiff *rtiff;
 3500|       |
 3501|       |#ifdef DEBUG
 3502|       |	printf("tiff2vips: libtiff version is \"%s\"\n", TIFFGetVersion());
 3503|       |#endif /*DEBUG*/
 3504|       |
 3505|  3.74k|	vips__tiff_init();
 3506|       |
 3507|  3.74k|	if (!(rtiff = rtiff_new(source, out,
  ------------------
  |  Branch (3507:6): [True: 0, False: 3.74k]
  ------------------
 3508|  3.74k|			  page, n, autorotate, subifd, fail_on, unlimited)) ||
 3509|  3.74k|		rtiff_header_read_all(rtiff))
  ------------------
  |  Branch (3509:3): [True: 0, False: 3.74k]
  ------------------
 3510|      0|		return -1;
 3511|       |
 3512|  3.74k|	if (rtiff->header.tiled) {
  ------------------
  |  Branch (3512:6): [True: 823, False: 2.91k]
  ------------------
 3513|    823|		if (rtiff_read_tilewise(rtiff, out))
  ------------------
  |  Branch (3513:7): [True: 5, False: 818]
  ------------------
 3514|      5|			return -1;
 3515|    823|	}
 3516|  2.91k|	else {
 3517|  2.91k|		if (rtiff_read_stripwise(rtiff, out))
  ------------------
  |  Branch (3517:7): [True: 1.10k, False: 1.80k]
  ------------------
 3518|  1.10k|			return -1;
 3519|  2.91k|	}
 3520|       |
 3521|       |	/* We never call vips_source_decode() since we need to be able to
 3522|       |	 * seek() the whole way through the file. Just minimise instead,
 3523|       |	 */
 3524|  2.62k|	vips_source_minimise(source);
 3525|       |
 3526|  2.62k|	return 0;
 3527|  3.74k|}
tiff2vips.c:vips__testtiff_source:
 3432|  16.0k|{
 3433|  16.0k|	TIFF *tif;
 3434|  16.0k|	gboolean property;
 3435|       |
 3436|  16.0k|	vips__tiff_init();
 3437|       |
 3438|  16.0k|	if (!(tif = vips__tiff_openin_source(source, rtiff_handler_error,
  ------------------
  |  Branch (3438:6): [True: 6.36k, False: 9.73k]
  ------------------
 3439|  16.0k|		rtiff_handler_warning, NULL, FALSE))) {
  ------------------
  |  |  206|  16.0k|#define FALSE   0               /* values of boolean */
  ------------------
 3440|  6.36k|		vips_error_clear();
 3441|  6.36k|		return FALSE;
  ------------------
  |  |  206|  6.36k|#define FALSE   0               /* values of boolean */
  ------------------
 3442|  6.36k|	}
 3443|       |
 3444|  9.73k|	property = fn ? fn(tif) : TRUE;
  ------------------
  |  |  209|  14.6k|#define TRUE    1
  ------------------
  |  Branch (3444:13): [True: 4.86k, False: 4.86k]
  ------------------
 3445|       |
 3446|  9.73k|	TIFFClose(tif);
 3447|       |
 3448|  9.73k|	return property;
 3449|  16.0k|}
tiff2vips.c:rtiff_handler_error:
  624|  1.40M|{
  625|  1.40M|	vips_verror("tiff2vips", fmt, ap);
  626|  1.40M|	return 1;
  627|  1.40M|}
tiff2vips.c:rtiff_handler_warning:
  632|   393k|{
  633|   393k|	if (user_data) {
  ------------------
  |  Branch (633:6): [True: 316k, False: 76.7k]
  ------------------
  634|   316k|		Rtiff *rtiff = (Rtiff*) user_data;
  635|   316k|		if (rtiff->fail_on >= VIPS_FAIL_ON_WARNING) {
  ------------------
  |  Branch (635:7): [True: 0, False: 316k]
  ------------------
  636|      0|			rtiff->failed = TRUE;
  ------------------
  |  |  209|      0|#define TRUE    1
  ------------------
  637|      0|		}
  638|   316k|	}
  639|   393k|	g_logv("tiff2vips", G_LOG_LEVEL_WARNING, fmt, ap);
  640|   393k|	return 1;
  641|   393k|}
tiff2vips.c:rtiff_new:
  647|  8.60k|{
  648|  8.60k|	Rtiff *rtiff;
  649|       |
  650|  8.60k|	if (!(rtiff = VIPS_NEW(out, Rtiff)))
  ------------------
  |  |   70|  8.60k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  8.60k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  8.60k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  8.60k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  8.60k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (650:6): [True: 0, False: 8.60k]
  ------------------
  651|      0|		return NULL;
  652|       |
  653|  8.60k|	g_object_ref(source);
  654|  8.60k|	rtiff->source = source;
  655|  8.60k|	rtiff->out = out;
  656|  8.60k|	rtiff->page = page;
  657|  8.60k|	rtiff->n = n;
  658|  8.60k|	rtiff->autorotate = autorotate;
  659|  8.60k|	rtiff->subifd = subifd;
  660|  8.60k|	rtiff->fail_on = fail_on;
  661|  8.60k|	g_rec_mutex_init(&rtiff->lock);
  662|  8.60k|	rtiff->tiff = NULL;
  663|  8.60k|	rtiff->n_pages = 0;
  664|  8.60k|	rtiff->current_page = -1;
  665|  8.60k|	rtiff->sfn = NULL;
  666|  8.60k|	rtiff->client = NULL;
  667|  8.60k|	rtiff->memcpy = FALSE;
  ------------------
  |  |  206|  8.60k|#define FALSE   0               /* values of boolean */
  ------------------
  668|  8.60k|	rtiff->plane_buf = NULL;
  669|  8.60k|	rtiff->contig_buf = NULL;
  670|  8.60k|	rtiff->y_pos = 0;
  671|  8.60k|	rtiff->failed = FALSE;
  ------------------
  |  |  206|  8.60k|#define FALSE   0               /* values of boolean */
  ------------------
  672|       |
  673|  8.60k|	g_signal_connect(out, "close",
  ------------------
  |  |  491|  8.60k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  674|  8.60k|		G_CALLBACK(rtiff_close_cb), rtiff);
  675|  8.60k|	g_signal_connect(out, "minimise",
  ------------------
  |  |  491|  8.60k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  676|  8.60k|		G_CALLBACK(rtiff_minimise_cb), rtiff);
  677|       |
  678|  8.60k|	if (rtiff->page < 0 ||
  ------------------
  |  Branch (678:6): [True: 0, False: 8.60k]
  ------------------
  679|  8.60k|		rtiff->page > 1000000) {
  ------------------
  |  Branch (679:3): [True: 0, False: 8.60k]
  ------------------
  680|      0|		vips_error("tiff2vips", _("bad page number %d"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  681|      0|			rtiff->page);
  682|      0|		return NULL;
  683|      0|	}
  684|       |
  685|       |	/* We allow n == -1, meaning all pages. It gets swapped for a real n
  686|       |	 * value when we open the TIFF.
  687|       |	 */
  688|  8.60k|	if (rtiff->n != -1 &&
  ------------------
  |  Branch (688:6): [True: 8.60k, False: 0]
  ------------------
  689|  8.60k|		(rtiff->n < 1 || rtiff->n > 1000000)) {
  ------------------
  |  Branch (689:4): [True: 0, False: 8.60k]
  |  Branch (689:20): [True: 0, False: 8.60k]
  ------------------
  690|      0|		vips_error("tiff2vips", _("bad number of pages %d"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  691|      0|			rtiff->n);
  692|      0|		return NULL;
  693|      0|	}
  694|       |
  695|  8.60k|	if (!(rtiff->tiff = vips__tiff_openin_source(source,
  ------------------
  |  Branch (695:6): [True: 0, False: 8.60k]
  ------------------
  696|  8.60k|		rtiff_handler_error, rtiff_handler_warning, rtiff, unlimited)))
  697|      0|		return NULL;
  698|       |
  699|  8.60k|	return rtiff;
  700|  8.60k|}
tiff2vips.c:rtiff_close_cb:
  606|  8.59k|{
  607|  8.59k|	rtiff_free(rtiff);
  608|  8.59k|}
tiff2vips.c:rtiff_free:
  598|  8.59k|{
  599|  8.59k|	VIPS_FREEF(TIFFClose, rtiff->tiff);
  ------------------
  |  |   41|  8.59k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.59k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  8.59k|	{ \
  |  |   43|  8.59k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 8.59k, False: 0]
  |  |  ------------------
  |  |   44|  8.59k|			(void) F((S)); \
  |  |   45|  8.59k|			(S) = 0; \
  |  |   46|  8.59k|		} \
  |  |   47|  8.59k|	} \
  |  |   48|  8.59k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.59k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  600|  8.59k|	g_rec_mutex_clear(&rtiff->lock);
  601|  8.59k|	VIPS_UNREF(rtiff->source);
  ------------------
  |  |   57|  8.59k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  8.59k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  8.59k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  8.59k|	{ \
  |  |  |  |   43|  8.59k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 8.59k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  8.59k|			(void) F((S)); \
  |  |  |  |   45|  8.59k|			(S) = 0; \
  |  |  |  |   46|  8.59k|		} \
  |  |  |  |   47|  8.59k|	} \
  |  |  |  |   48|  8.59k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  8.59k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  602|  8.59k|}
tiff2vips.c:rtiff_minimise_cb:
  612|  18.5k|{
  613|       |	/* We must not minimised tiled images. These can be read from many
  614|       |	 * threads, and this minimise handler is not inside the lock.
  615|       |	 */
  616|  18.5k|	if (!rtiff->header.tiled &&
  ------------------
  |  Branch (616:6): [True: 15.2k, False: 3.28k]
  ------------------
  617|  18.5k|		rtiff->source)
  ------------------
  |  Branch (617:3): [True: 15.2k, False: 0]
  ------------------
  618|  15.2k|		vips_source_minimise(rtiff->source);
  619|  18.5k|}
tiff2vips.c:rtiff_header_read_all:
 3375|  8.60k|{
 3376|       |#ifdef DEBUG
 3377|       |	printf("rtiff_header_read_all: reading header for page %d ...\n",
 3378|       |		rtiff->page);
 3379|       |#endif /*DEBUG*/
 3380|       |
 3381|       |	/* -1 means "to the end".
 3382|       |	 *
 3383|       |	 * We must count pages before selecting and reading the header of the
 3384|       |	 * first page, since scanning a TIFF can change the value of libtiff's
 3385|       |	 * internal header fields in strange ways, especially if the TIFF is
 3386|       |	 * corrupt.
 3387|       |	 */
 3388|  8.60k|	rtiff->n_pages = rtiff_n_pages(rtiff);
 3389|       |
 3390|  8.60k|	if (rtiff_set_page(rtiff, rtiff->page) ||
  ------------------
  |  Branch (3390:6): [True: 0, False: 8.60k]
  ------------------
 3391|  8.60k|		rtiff_header_read(rtiff, &rtiff->header))
  ------------------
  |  Branch (3391:3): [True: 779, False: 7.82k]
  ------------------
 3392|    779|		return -1;
 3393|       |
 3394|       |	/* If we're to read many pages, verify that they are all identical.
 3395|       |	 */
 3396|  7.82k|	if (rtiff->n == -1)
  ------------------
  |  Branch (3396:6): [True: 0, False: 7.82k]
  ------------------
 3397|      0|		rtiff->n = rtiff->n_pages - rtiff->page;
 3398|  7.82k|	if (rtiff->n > 1) {
  ------------------
  |  Branch (3398:6): [True: 0, False: 7.82k]
  ------------------
 3399|      0|		int i;
 3400|       |
 3401|      0|		for (i = 1; i < rtiff->n; i++) {
  ------------------
  |  Branch (3401:15): [True: 0, False: 0]
  ------------------
 3402|      0|			RtiffHeader header;
 3403|       |
 3404|       |#ifdef DEBUG
 3405|       |			printf("rtiff_header_read_all: verifying header for page %d ...\n",
 3406|       |				rtiff->page + i);
 3407|       |#endif /*DEBUG*/
 3408|       |
 3409|      0|			if (rtiff_set_page(rtiff, rtiff->page + i) ||
  ------------------
  |  Branch (3409:8): [True: 0, False: 0]
  ------------------
 3410|      0|				rtiff_header_read(rtiff, &header))
  ------------------
  |  Branch (3410:5): [True: 0, False: 0]
  ------------------
 3411|      0|				return -1;
 3412|       |
 3413|      0|			if (!rtiff_header_equal(&rtiff->header, &header)) {
  ------------------
  |  Branch (3413:8): [True: 0, False: 0]
  ------------------
 3414|      0|				vips_error("tiff2vips", _("page %d differs from page %d"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3415|      0|					rtiff->page + i, rtiff->page);
 3416|      0|				return -1;
 3417|      0|			}
 3418|      0|		}
 3419|       |
 3420|       |		/* Make sure the next set_page() will reread the directory.
 3421|       |		 */
 3422|      0|		rtiff->current_page = -1;
 3423|      0|	}
 3424|       |
 3425|  7.82k|	return 0;
 3426|  7.82k|}
tiff2vips.c:rtiff_n_pages:
  844|  8.60k|{
  845|  8.60k|	int n;
  846|       |
  847|  8.60k|	(void) TIFFSetDirectory(rtiff->tiff, 0);
  848|       |
  849|  11.0k|	for (n = 1; TIFFReadDirectory(rtiff->tiff); n++)
  ------------------
  |  Branch (849:14): [True: 2.49k, False: 8.60k]
  ------------------
  850|  2.49k|		;
  851|       |
  852|       |	/* Make sure the nest set_page() will set the directory.
  853|       |	 */
  854|  8.60k|	rtiff->current_page = -1;
  855|       |
  856|       |#ifdef DEBUG
  857|       |	printf("rtiff_n_pages: found %d pages\n", n);
  858|       |#endif /*DEBUG*/
  859|       |
  860|  8.60k|	return n;
  861|  8.60k|}
tiff2vips.c:rtiff_set_page:
  794|  61.4k|{
  795|  61.4k|	if (rtiff->current_page != page) {
  ------------------
  |  Branch (795:6): [True: 8.60k, False: 52.8k]
  ------------------
  796|       |#ifdef DEBUG
  797|       |		printf("rtiff_set_page: selecting page %d, subifd %d\n",
  798|       |			page, rtiff->subifd);
  799|       |#endif /*DEBUG*/
  800|       |
  801|  8.60k|		if (!TIFFSetDirectory(rtiff->tiff, page)) {
  ------------------
  |  Branch (801:7): [True: 0, False: 8.60k]
  ------------------
  802|      0|			vips_error("tiff2vips", _("TIFF does not contain page %d"), page);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  803|      0|			return -1;
  804|      0|		}
  805|       |
  806|  8.60k|		if (rtiff->subifd >= 0) {
  ------------------
  |  Branch (806:7): [True: 0, False: 8.60k]
  ------------------
  807|      0|			guint16 subifd_count;
  808|      0|			toff_t *subifd_offsets;
  809|       |
  810|      0|			if (!TIFFGetField(rtiff->tiff, TIFFTAG_SUBIFD,
  ------------------
  |  |  321|      0|#define TIFFTAG_SUBIFD 330                 /* subimage descriptors */
  ------------------
  |  Branch (810:8): [True: 0, False: 0]
  ------------------
  811|      0|					&subifd_count, &subifd_offsets)) {
  812|      0|				vips_error("tiff2vips", "%s", _("no SUBIFD tag"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  813|      0|				return -1;
  814|      0|			}
  815|       |
  816|      0|			if (rtiff->subifd >= subifd_count) {
  ------------------
  |  Branch (816:8): [True: 0, False: 0]
  ------------------
  817|      0|				vips_error("tiff2vips",
  818|      0|					_("subifd %d out of range, only 0-%d available"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  819|      0|					rtiff->subifd,
  820|      0|					subifd_count - 1);
  821|      0|				return -1;
  822|      0|			}
  823|       |
  824|      0|			if (!TIFFSetSubDirectory(rtiff->tiff,
  ------------------
  |  Branch (824:8): [True: 0, False: 0]
  ------------------
  825|      0|					subifd_offsets[rtiff->subifd])) {
  826|      0|				vips_error("tiff2vips", "%s", _("subdirectory unreadable"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  827|      0|				return -1;
  828|      0|			}
  829|      0|		}
  830|       |
  831|  8.60k|		rtiff->current_page = page;
  832|       |
  833|       |		/* These can get unset when we change directories. Make sure
  834|       |		 * they are set again.
  835|       |		 */
  836|  8.60k|		rtiff_set_decode_format(rtiff);
  837|  8.60k|	}
  838|       |
  839|  61.4k|	return 0;
  840|  61.4k|}
tiff2vips.c:rtiff_set_decode_format:
  778|  24.4k|{
  779|       |	/* Ask for YCbCr->RGB for jpg data.
  780|       |	 */
  781|  24.4k|	if (rtiff->header.compression == COMPRESSION_JPEG ||
  ------------------
  |  |  190|  48.8k|#define COMPRESSION_JPEG 7            /* %JPEG DCT compression */
  ------------------
  |  Branch (781:6): [True: 1.47k, False: 22.9k]
  ------------------
  782|  24.4k|		rtiff->header.compression == COMPRESSION_OJPEG)
  ------------------
  |  |  189|  22.9k|#define COMPRESSION_OJPEG 6           /* !6.0 JPEG */
  ------------------
  |  Branch (782:3): [True: 4.54k, False: 18.4k]
  ------------------
  783|  6.01k|		TIFFSetField(rtiff->tiff, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
  ------------------
  |  |  706|  6.01k|#define TIFFTAG_JPEGCOLORMODE 65538  /* Auto RGB<=>YCbCr convert? */
  ------------------
              		TIFFSetField(rtiff->tiff, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
  ------------------
  |  |  708|  6.01k|#define JPEGCOLORMODE_RGB 0x0001     /* do auto conversion */
  ------------------
  784|       |
  785|       |	/* Ask for SGI LOGLUV as 3xfloat.
  786|       |	 */
  787|  24.4k|	if (rtiff->header.photometric_interpretation ==
  ------------------
  |  Branch (787:6): [True: 505, False: 23.9k]
  ------------------
  788|  24.4k|		PHOTOMETRIC_LOGLUV)
  ------------------
  |  |  233|  24.4k|#define PHOTOMETRIC_LOGLUV 32845           /* CIE Log2(L) (u',v') */
  ------------------
  789|    505|		TIFFSetField(rtiff->tiff, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_FLOAT);
  ------------------
  |  |  743|    505|#define TIFFTAG_SGILOGDATAFMT 65560    /* SGILog user data format */
  ------------------
              		TIFFSetField(rtiff->tiff, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_FLOAT);
  ------------------
  |  |  744|    505|#define SGILOGDATAFMT_FLOAT 0          /* IEEE float samples */
  ------------------
  790|  24.4k|}
tiff2vips.c:rtiff_header_read:
 2989|  8.60k|{
 2990|  8.60k|	int i;
 2991|  8.60k|	guint16 extra_samples_count;
 2992|  8.60k|	guint16 *extra_samples_types;
 2993|  8.60k|	guint16 subifd_count;
 2994|  8.60k|	toff_t *subifd_offsets;
 2995|  8.60k|	char *image_description;
 2996|  8.60k|	guint32 max_tile_dimension;
 2997|  8.60k|	gboolean can_read_as_rgba;
 2998|       |
 2999|  8.60k|	if (!tfget32(rtiff->tiff, TIFFTAG_IMAGEWIDTH,
  ------------------
  |  |  178|  8.60k|#define TIFFTAG_IMAGEWIDTH 256        /* image width in pixels */
  ------------------
  |  Branch (2999:6): [True: 0, False: 8.60k]
  ------------------
 3000|  8.60k|			&header->width) ||
 3001|  8.60k|		!tfget32(rtiff->tiff, TIFFTAG_IMAGELENGTH,
  ------------------
  |  |  179|  8.60k|#define TIFFTAG_IMAGELENGTH 257       /* image height in pixels */
  ------------------
  |  Branch (3001:3): [True: 0, False: 8.60k]
  ------------------
 3002|  8.60k|			&header->height) ||
 3003|  8.60k|		!tfget16(rtiff->tiff, TIFFTAG_SAMPLESPERPIXEL,
  ------------------
  |  |  257|  8.60k|#define TIFFTAG_SAMPLESPERPIXEL 277        /* samples per pixel */
  ------------------
  |  Branch (3003:3): [True: 0, False: 8.60k]
  ------------------
 3004|  8.60k|			&header->samples_per_pixel) ||
 3005|  8.60k|		!tfget16(rtiff->tiff, TIFFTAG_BITSPERSAMPLE,
  ------------------
  |  |  180|  8.60k|#define TIFFTAG_BITSPERSAMPLE 258     /* bits per channel (sample) */
  ------------------
  |  Branch (3005:3): [True: 0, False: 8.60k]
  ------------------
 3006|  8.60k|			&header->bits_per_sample) ||
 3007|  8.60k|		!tfget16(rtiff->tiff, TIFFTAG_PHOTOMETRIC,
  ------------------
  |  |  220|  8.60k|#define TIFFTAG_PHOTOMETRIC 262            /* photometric interpretation */
  ------------------
  |  Branch (3007:3): [True: 582, False: 8.02k]
  ------------------
 3008|  8.60k|			&header->photometric_interpretation) ||
 3009|  8.60k|		!tfget16(rtiff->tiff, TIFFTAG_INKSET,
  ------------------
  |  |  322|  8.02k|#define TIFFTAG_INKSET 332                 /* !inks in separated image */
  ------------------
  |  Branch (3009:3): [True: 0, False: 8.02k]
  ------------------
 3010|  8.02k|			&header->inkset))
 3011|    582|		return -1;
 3012|       |
 3013|  8.02k|	header->read_as_rgba = FALSE;
  ------------------
  |  |  206|  8.02k|#define FALSE   0               /* values of boolean */
  ------------------
 3014|       |
 3015|       |	/* TIFF images which can be read by TIFFRGBAImage or TIFFReadRGBATile.
 3016|       |	 */
 3017|  8.02k|	can_read_as_rgba =
 3018|  8.02k|		(header->samples_per_pixel == 1 ||
  ------------------
  |  Branch (3018:4): [True: 3.86k, False: 4.16k]
  ------------------
 3019|  8.02k|			header->samples_per_pixel == 3 ||
  ------------------
  |  Branch (3019:4): [True: 3.10k, False: 1.05k]
  ------------------
 3020|  8.02k|			header->samples_per_pixel == 4) &&
  ------------------
  |  Branch (3020:4): [True: 804, False: 251]
  ------------------
 3021|  8.02k|		(header->bits_per_sample == 1 ||
  ------------------
  |  Branch (3021:4): [True: 2.03k, False: 5.74k]
  ------------------
 3022|  7.77k|			header->bits_per_sample == 2 ||
  ------------------
  |  Branch (3022:4): [True: 407, False: 5.33k]
  ------------------
 3023|  7.77k|			header->bits_per_sample == 4 ||
  ------------------
  |  Branch (3023:4): [True: 140, False: 5.19k]
  ------------------
 3024|  7.77k|			header->bits_per_sample == 8 ||
  ------------------
  |  Branch (3024:4): [True: 3.66k, False: 1.53k]
  ------------------
 3025|  7.77k|			header->bits_per_sample == 16);
  ------------------
  |  Branch (3025:4): [True: 776, False: 754]
  ------------------
 3026|       |
 3027|  8.02k|	TIFFGetFieldDefaulted(rtiff->tiff,
 3028|  8.02k|		TIFFTAG_COMPRESSION, &header->compression);
  ------------------
  |  |  181|  8.02k|#define TIFFTAG_COMPRESSION 259       /* data compression technique */
  ------------------
 3029|       |
 3030|       |	/* We'll decode old-style JPEG using the libtiff RGBA path.
 3031|       |	 */
 3032|  8.02k|	if (header->compression == COMPRESSION_OJPEG) {
  ------------------
  |  |  189|  8.02k|#define COMPRESSION_OJPEG 6           /* !6.0 JPEG */
  ------------------
  |  Branch (3032:6): [True: 2.31k, False: 5.71k]
  ------------------
 3033|  2.31k|		if (!can_read_as_rgba) {
  ------------------
  |  Branch (3033:7): [True: 7, False: 2.30k]
  ------------------
 3034|      7|			vips_error("tiff2vips", "%s", _("unsupported tiff image type"));
  ------------------
  |  |   30|      7|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      7|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3035|      7|			return -1;
 3036|      7|		}
 3037|       |
 3038|  2.30k|		header->read_as_rgba = TRUE;
  ------------------
  |  |  209|  2.30k|#define TRUE    1
  ------------------
 3039|  2.30k|	}
 3040|       |
 3041|       |	/* One of the types we decompress?
 3042|       |	 */
 3043|  37.0k|	for (i = 0; i < VIPS_NUMBER(rtiff_we_decompress); i++)
  ------------------
  |  |   60|  37.0k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (3043:14): [True: 29.8k, False: 7.26k]
  ------------------
 3044|  29.8k|		if (header->compression == rtiff_we_decompress[i]) {
  ------------------
  |  Branch (3044:7): [True: 757, False: 29.0k]
  ------------------
 3045|       |#ifdef DEBUG
 3046|       |			printf("rtiff_header_read: compression %d handled by us\n",
 3047|       |				header->compression);
 3048|       |#endif /*DEBUG*/
 3049|    757|			header->we_decompress = TRUE;
  ------------------
  |  |  209|    757|#define TRUE    1
  ------------------
 3050|    757|			break;
 3051|    757|		}
 3052|       |
 3053|       |	/* We must set this here since it'll change the value of scanline_size.
 3054|       |	 */
 3055|  8.01k|	rtiff_set_decode_format(rtiff);
 3056|       |
 3057|       |	/* If there's YCbCr chroma subsampling and we're not already using one of
 3058|       |	 * the JPEG decompressors, use the libtiff RGBA path.
 3059|       |	 */
 3060|  8.01k|	if (!header->read_as_rgba &&
  ------------------
  |  Branch (3060:6): [True: 5.71k, False: 2.30k]
  ------------------
 3061|  8.01k|		header->compression != COMPRESSION_JPEG &&
  ------------------
  |  |  190|  13.7k|#define COMPRESSION_JPEG 7            /* %JPEG DCT compression */
  ------------------
  |  Branch (3061:3): [True: 4.95k, False: 757]
  ------------------
 3062|  8.01k|		header->photometric_interpretation == PHOTOMETRIC_YCBCR) {
  ------------------
  |  |  227|  4.95k|#define PHOTOMETRIC_YCBCR 6                /* !CCIR 601 */
  ------------------
  |  Branch (3062:3): [True: 475, False: 4.48k]
  ------------------
 3063|    475|		guint16 hsub, vsub;
 3064|       |
 3065|    475|		TIFFGetFieldDefaulted(rtiff->tiff,
 3066|    475|			TIFFTAG_YCBCRSUBSAMPLING, &hsub, &vsub);
  ------------------
  |  |  388|    475|#define TIFFTAG_YCBCRSUBSAMPLING 530       /* !YCbCr subsampling factors */
  ------------------
 3067|    475|		if (hsub != 1 || vsub != 1) {
  ------------------
  |  Branch (3067:7): [True: 420, False: 55]
  |  Branch (3067:20): [True: 55, False: 0]
  ------------------
 3068|    475|			if (!can_read_as_rgba) {
  ------------------
  |  Branch (3068:8): [True: 2, False: 473]
  ------------------
 3069|      2|				vips_error("tiff2vips",
 3070|      2|					"%s", _("subsampled images not supported"));
  ------------------
  |  |   30|      2|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      2|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3071|      2|				return -1;
 3072|      2|			}
 3073|       |
 3074|    473|			header->read_as_rgba = TRUE;
  ------------------
  |  |  209|    473|#define TRUE    1
  ------------------
 3075|    473|		}
 3076|    475|	}
 3077|       |
 3078|  8.01k|	if (header->photometric_interpretation == PHOTOMETRIC_LOGLUV) {
  ------------------
  |  |  233|  8.01k|#define PHOTOMETRIC_LOGLUV 32845           /* CIE Log2(L) (u',v') */
  ------------------
  |  Branch (3078:6): [True: 257, False: 7.75k]
  ------------------
 3079|    257|		if (header->compression != COMPRESSION_SGILOG &&
  ------------------
  |  |  210|    514|#define COMPRESSION_SGILOG 34676   /* SGI Log Luminance RLE */
  ------------------
  |  Branch (3079:7): [True: 103, False: 154]
  ------------------
 3080|    257|			header->compression != COMPRESSION_SGILOG24) {
  ------------------
  |  |  211|    103|#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */
  ------------------
  |  Branch (3080:4): [True: 2, False: 101]
  ------------------
 3081|      2|			vips_error("tiff2vips",
 3082|      2|				"%s", _("not SGI-compressed LOGLUV"));
  ------------------
  |  |   30|      2|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      2|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3083|      2|			return -1;
 3084|      2|		}
 3085|    257|	}
 3086|       |
 3087|       |	/* For logluv, the calibration factor to get to absolute luminance.
 3088|       |	 */
 3089|  8.01k|	if (!TIFFGetField(rtiff->tiff, TIFFTAG_STONITS, &header->stonits))
  ------------------
  |  |  490|  8.01k|#define TIFFTAG_STONITS 37439 /* Sample value to Nits */
  ------------------
  |  Branch (3089:6): [True: 8.00k, False: 6]
  ------------------
 3090|  8.00k|		header->stonits = 1.0;
 3091|       |
 3092|       |	/* Arbitrary sanity-checking limits.
 3093|       |	 */
 3094|  8.01k|	if (header->width <= 0 ||
  ------------------
  |  Branch (3094:6): [True: 0, False: 8.01k]
  ------------------
 3095|  8.01k|		header->width >= VIPS_MAX_COORD ||
  ------------------
  |  |   69|  16.0k|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (3095:3): [True: 10, False: 8.00k]
  ------------------
 3096|  8.01k|		header->height <= 0 ||
  ------------------
  |  Branch (3096:3): [True: 0, False: 8.00k]
  ------------------
 3097|  8.01k|		header->height >= VIPS_MAX_COORD) {
  ------------------
  |  |   69|  8.00k|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (3097:3): [True: 19, False: 7.98k]
  ------------------
 3098|     29|		vips_error("tiff2vips",
 3099|     29|			"%s", _("width/height out of range"));
  ------------------
  |  |   30|     29|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     29|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3100|     29|		return -1;
 3101|     29|	}
 3102|       |
 3103|  7.98k|	if (header->samples_per_pixel <= 0 ||
  ------------------
  |  Branch (3103:6): [True: 0, False: 7.98k]
  ------------------
 3104|  7.98k|		header->samples_per_pixel > 10000 ||
  ------------------
  |  Branch (3104:3): [True: 16, False: 7.96k]
  ------------------
 3105|  7.98k|		header->bits_per_sample <= 0 ||
  ------------------
  |  Branch (3105:3): [True: 0, False: 7.96k]
  ------------------
 3106|  7.98k|		header->bits_per_sample > 32) {
  ------------------
  |  Branch (3106:3): [True: 37, False: 7.93k]
  ------------------
 3107|     53|		vips_error("tiff2vips",
 3108|     53|			"%s", _("samples out of range"));
  ------------------
  |  |   30|     53|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     53|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3109|     53|		return -1;
 3110|     53|	}
 3111|       |
 3112|  7.93k|	header->sample_format = get_sample_format(rtiff->tiff);
 3113|  7.93k|	header->orientation = get_orientation(rtiff->tiff);
 3114|       |
 3115|  7.93k|	header->separate = FALSE;
  ------------------
  |  |  206|  7.93k|#define FALSE   0               /* values of boolean */
  ------------------
 3116|  7.93k|	if (tfexists(rtiff->tiff, TIFFTAG_PLANARCONFIG)) {
  ------------------
  |  |  264|  7.93k|#define TIFFTAG_PLANARCONFIG 284           /* storage organization */
  ------------------
  |  Branch (3116:6): [True: 7.93k, False: 0]
  ------------------
 3117|  7.93k|		int v;
 3118|       |
 3119|  7.93k|		if (!tfget16(rtiff->tiff, TIFFTAG_PLANARCONFIG, &v))
  ------------------
  |  |  264|  7.93k|#define TIFFTAG_PLANARCONFIG 284           /* storage organization */
  ------------------
  |  Branch (3119:7): [True: 0, False: 7.93k]
  ------------------
 3120|      0|			return -1;
 3121|  7.93k|		if (v == PLANARCONFIG_SEPARATE)
  ------------------
  |  |  266|  7.93k|#define PLANARCONFIG_SEPARATE 2            /* separate planes of data */
  ------------------
  |  Branch (3121:7): [True: 426, False: 7.50k]
  ------------------
 3122|    426|			header->separate = TRUE;
  ------------------
  |  |  209|    426|#define TRUE    1
  ------------------
 3123|  7.93k|	}
 3124|       |
 3125|       |	/* TIFFGetField needs a guint16 to write count to.
 3126|       |	 */
 3127|  7.93k|	if (TIFFGetField(rtiff->tiff, TIFFTAG_SUBIFD,
  ------------------
  |  |  321|  7.93k|#define TIFFTAG_SUBIFD 330                 /* subimage descriptors */
  ------------------
  |  Branch (3127:6): [True: 10, False: 7.92k]
  ------------------
 3128|  7.93k|			&subifd_count, &subifd_offsets))
 3129|     10|		header->subifd_count = subifd_count;
 3130|       |
 3131|       |	/* IMAGEDESCRIPTION often has useful metadata. libtiff makes sure
 3132|       |	 * that data is null-terminated and contains no embedded null
 3133|       |	 * characters.
 3134|       |	 */
 3135|  7.93k|	if (TIFFGetField(rtiff->tiff, TIFFTAG_IMAGEDESCRIPTION, &image_description))
  ------------------
  |  |  244|  7.93k|#define TIFFTAG_IMAGEDESCRIPTION 270       /* info about image */
  ------------------
  |  Branch (3135:6): [True: 53, False: 7.87k]
  ------------------
 3136|     53|		header->image_description =
 3137|     53|			vips_strdup(VIPS_OBJECT(rtiff->out), image_description);
  ------------------
  |  |  433|     53|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|     53|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     53|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3138|       |
 3139|       |	/* Tiles and strip images have slightly different fields.
 3140|       |	 */
 3141|  7.93k|	header->tiled = TIFFIsTiled(rtiff->tiff);
 3142|       |
 3143|  7.93k|	if (header->read_as_rgba) {
  ------------------
  |  Branch (3143:6): [True: 2.76k, False: 5.17k]
  ------------------
 3144|  2.76k|		header->we_decompress = FALSE;
  ------------------
  |  |  206|  2.76k|#define FALSE   0               /* values of boolean */
  ------------------
 3145|  2.76k|		header->photometric_interpretation = PHOTOMETRIC_RGB;
  ------------------
  |  |  223|  2.76k|#define PHOTOMETRIC_RGB 2                  /* RGB color model */
  ------------------
 3146|  2.76k|		header->samples_per_pixel = 4;
 3147|  2.76k|		header->bits_per_sample = 8;
 3148|  2.76k|		header->sample_format = SAMPLEFORMAT_UINT;
  ------------------
  |  |  334|  2.76k|#define SAMPLEFORMAT_UINT 1                /* !unsigned integer data */
  ------------------
 3149|  2.76k|		header->separate = FALSE;
  ------------------
  |  |  206|  2.76k|#define FALSE   0               /* values of boolean */
  ------------------
 3150|  2.76k|	}
 3151|       |
 3152|       |#ifdef DEBUG
 3153|       |	printf("rtiff_header_read: header.read_as_rgba = %d\n",
 3154|       |		header->read_as_rgba);
 3155|       |	printf("rtiff_header_read: header.width = %d\n",
 3156|       |		header->width);
 3157|       |	printf("rtiff_header_read: header.height = %d\n",
 3158|       |		header->height);
 3159|       |	printf("rtiff_header_read: header.samples_per_pixel = %d\n",
 3160|       |		header->samples_per_pixel);
 3161|       |	printf("rtiff_header_read: header.bits_per_sample = %d\n",
 3162|       |		header->bits_per_sample);
 3163|       |	printf("rtiff_header_read: header.sample_format = %d\n",
 3164|       |		header->sample_format);
 3165|       |	printf("rtiff_header_read: header.orientation = %d\n",
 3166|       |		header->orientation);
 3167|       |	printf("rtiff_header_read: header.tiled = %d\n",
 3168|       |		header->tiled);
 3169|       |#endif /*DEBUG*/
 3170|       |
 3171|  7.93k|	if (header->tiled) {
  ------------------
  |  Branch (3171:6): [True: 1.75k, False: 6.17k]
  ------------------
 3172|  1.75k|		if (!tfget32(rtiff->tiff, TIFFTAG_TILEWIDTH, &header->tile_width) ||
  ------------------
  |  |  311|  1.75k|#define TIFFTAG_TILEWIDTH 322              /* !tile width in pixels */
  ------------------
  |  Branch (3172:7): [True: 0, False: 1.75k]
  ------------------
 3173|  1.75k|			!tfget32(rtiff->tiff, TIFFTAG_TILELENGTH, &header->tile_height))
  ------------------
  |  |  312|  1.75k|#define TIFFTAG_TILELENGTH 323             /* !tile height in pixels */
  ------------------
  |  Branch (3173:4): [True: 0, False: 1.75k]
  ------------------
 3174|      0|			return -1;
 3175|       |
 3176|       |#ifdef DEBUG
 3177|       |		printf("rtiff_header_read: header.tile_width = %d\n",
 3178|       |			header->tile_width);
 3179|       |		printf("rtiff_header_read: header.tile_height = %d\n",
 3180|       |			header->tile_height);
 3181|       |#endif /*DEBUG*/
 3182|       |
 3183|       |		/* Arbitrary sanity-checking limits.
 3184|       |		 */
 3185|  1.75k|		max_tile_dimension = VIPS_MIN(8192,
  ------------------
  |  |   55|  7.01k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 42, False: 1.71k]
  |  |  |  Branch (55:32): [True: 727, False: 1.02k]
  |  |  |  Branch (55:32): [True: 727, False: 1.02k]
  |  |  |  Branch (55:44): [True: 689, False: 1.02k]
  |  |  |  Branch (55:44): [True: 689, False: 1.02k]
  |  |  ------------------
  ------------------
 3186|  1.75k|			VIPS_ROUND_UP(2 * VIPS_MAX(header->width, header->height), 256));
 3187|  1.75k|		if (header->tile_width <= 0 ||
  ------------------
  |  Branch (3187:7): [True: 0, False: 1.75k]
  ------------------
 3188|  1.75k|			header->tile_width > max_tile_dimension ||
  ------------------
  |  Branch (3188:4): [True: 11, False: 1.74k]
  ------------------
 3189|  1.75k|			header->tile_width % 16 != 0 ||
  ------------------
  |  Branch (3189:4): [True: 82, False: 1.66k]
  ------------------
 3190|  1.75k|			header->tile_height <= 0 ||
  ------------------
  |  Branch (3190:4): [True: 0, False: 1.66k]
  ------------------
 3191|  1.75k|			header->tile_height > max_tile_dimension ||
  ------------------
  |  Branch (3191:4): [True: 4, False: 1.65k]
  ------------------
 3192|  1.75k|			header->tile_height % 16 != 0) {
  ------------------
  |  Branch (3192:4): [True: 7, False: 1.64k]
  ------------------
 3193|    104|			vips_error("tiff2vips",
 3194|    104|				"%s", _("tile size out of range"));
  ------------------
  |  |   30|    104|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    104|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3195|    104|			return -1;
 3196|    104|		}
 3197|       |
 3198|  1.64k|		if (header->read_as_rgba) {
  ------------------
  |  Branch (3198:7): [True: 185, False: 1.46k]
  ------------------
 3199|    185|			header->tile_row_size = header->tile_width * 4;
 3200|    185|			header->tile_size = header->tile_row_size * header->tile_height;
 3201|    185|		}
 3202|  1.46k|		else {
 3203|  1.46k|			header->tile_size = TIFFTileSize(rtiff->tiff);
 3204|  1.46k|			header->tile_row_size = TIFFTileRowSize(rtiff->tiff);
 3205|  1.46k|		}
 3206|       |
 3207|       |#ifdef DEBUG
 3208|       |		printf("rtiff_header_read: header.tile_size = %zd\n",
 3209|       |			header->tile_size);
 3210|       |		printf("rtiff_header_read: header.tile_row_size = %zd\n",
 3211|       |			header->tile_row_size);
 3212|       |#endif /*DEBUG*/
 3213|       |
 3214|       |		/* Fuzzed TIFFs can give crazy values for tile_size. Sanity
 3215|       |		 * check at 100mb per tile.
 3216|       |		 */
 3217|  1.64k|		if (header->tile_size <= 0 ||
  ------------------
  |  Branch (3217:7): [True: 0, False: 1.64k]
  ------------------
 3218|  1.64k|			header->tile_size > 100 * 1000 * 1000 ||
  ------------------
  |  Branch (3218:4): [True: 0, False: 1.64k]
  ------------------
 3219|  1.64k|			header->tile_row_size <= 0 ||
  ------------------
  |  Branch (3219:4): [True: 0, False: 1.64k]
  ------------------
 3220|  1.64k|			header->tile_row_size > 100 * 1000 * 1000) {
  ------------------
  |  Branch (3220:4): [True: 0, False: 1.64k]
  ------------------
 3221|      0|			vips_error("tiff2vips",
 3222|      0|				"%s", _("tile size out of range"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3223|      0|			return -1;
 3224|      0|		}
 3225|       |
 3226|       |		/* Stop some compiler warnings.
 3227|       |		 */
 3228|  1.64k|		header->rows_per_strip = 0;
 3229|  1.64k|		header->strip_size = 0;
 3230|  1.64k|		header->number_of_strips = 0;
 3231|  1.64k|		header->read_height = 0;
 3232|  1.64k|		header->read_size = 0;
 3233|  1.64k|	}
 3234|  6.17k|	else {
 3235|  6.17k|		if (!tfget32(rtiff->tiff,
  ------------------
  |  Branch (3235:7): [True: 0, False: 6.17k]
  ------------------
 3236|  6.17k|				TIFFTAG_ROWSPERSTRIP, &header->rows_per_strip))
  ------------------
  |  |  258|  6.17k|#define TIFFTAG_ROWSPERSTRIP 278           /* rows per strip of data */
  ------------------
 3237|      0|			return -1;
 3238|       |
 3239|       |		/* rows_per_strip can be 2 ** 32 - 1, meaning the
 3240|       |		 * whole image. Clip this down to height to avoid
 3241|       |		 * confusing vips.
 3242|       |		 *
 3243|       |		 * And it mustn't be zero.
 3244|       |		 */
 3245|  6.17k|		header->rows_per_strip = VIPS_CLIP(1,
  ------------------
  |  |   57|  6.17k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  12.3k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 6.17k]
  |  |  |  |  |  Branch (54:32): [True: 3.07k, False: 3.10k]
  |  |  |  |  |  Branch (54:44): [True: 3.07k, False: 3.10k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3246|  6.17k|			header->rows_per_strip, header->height);
 3247|       |
 3248|  6.17k|		header->number_of_strips = TIFFNumberOfStrips(rtiff->tiff);
 3249|       |
 3250|  6.17k|		if (header->read_as_rgba) {
  ------------------
  |  Branch (3250:7): [True: 2.50k, False: 3.67k]
  ------------------
 3251|  2.50k|			header->scanline_size = header->width * 4;
 3252|  2.50k|			header->strip_size = header->scanline_size * header->rows_per_strip;
 3253|  2.50k|		}
 3254|  3.67k|		else {
 3255|  3.67k|			header->scanline_size = TIFFScanlineSize(rtiff->tiff);
 3256|  3.67k|			header->strip_size = TIFFStripSize(rtiff->tiff);
 3257|  3.67k|		}
 3258|       |
 3259|       |#ifdef DEBUG
 3260|       |		printf("rtiff_header_read: header.rows_per_strip = %d\n",
 3261|       |			header->rows_per_strip);
 3262|       |		printf("rtiff_header_read: header.strip_size = %zd\n",
 3263|       |			header->strip_size);
 3264|       |		printf("rtiff_header_read: header.scanline_size = %zd\n",
 3265|       |			header->scanline_size);
 3266|       |		printf("rtiff_header_read: header.number_of_strips = %d\n",
 3267|       |			header->number_of_strips);
 3268|       |#endif /*DEBUG*/
 3269|       |
 3270|       |		/* libtiff has two strip-wise readers. TIFFReadEncodedStrip()
 3271|       |		 * decompresses an entire strip to memory. It's fast, but it
 3272|       |		 * will need a lot of ram if the strip is large.
 3273|       |		 * TIFFReadScanline() reads a single scanline. It's slower, but
 3274|       |		 * will save a lot of memory if strips are large.
 3275|       |		 *
 3276|       |		 * If this image has a strip size of over 128 lines, fall back
 3277|       |		 * to TIFFReadScanline(), otherwise use TIFFReadEncodedStrip().
 3278|       |		 *
 3279|       |		 * Don't do this in plane-separate mode. TIFFReadScanline() is
 3280|       |		 * too fiddly to use in this case.
 3281|       |		 *
 3282|       |		 * Don't try scanline reading for YCbCr images.
 3283|       |		 * TIFFScanlineSize() will not work in this case due to
 3284|       |		 * chroma subsampling.
 3285|       |		 *
 3286|       |		 * Don't use scanline reading if we're going to use TIFFRGBAImage
 3287|       |		 */
 3288|  6.17k|		if (header->rows_per_strip > 128 &&
  ------------------
  |  Branch (3288:7): [True: 149, False: 6.03k]
  ------------------
 3289|  6.17k|			!header->separate &&
  ------------------
  |  Branch (3289:4): [True: 147, False: 2]
  ------------------
 3290|  6.17k|			header->photometric_interpretation != PHOTOMETRIC_YCBCR &&
  ------------------
  |  |  227|  6.32k|#define PHOTOMETRIC_YCBCR 6                /* !CCIR 601 */
  ------------------
  |  Branch (3290:4): [True: 56, False: 91]
  ------------------
 3291|  6.17k|			!header->read_as_rgba) {
  ------------------
  |  Branch (3291:4): [True: 23, False: 33]
  ------------------
 3292|     23|			header->read_scanlinewise = TRUE;
  ------------------
  |  |  209|     23|#define TRUE    1
  ------------------
 3293|     23|			header->read_height = 1;
 3294|     23|			header->read_size = rtiff->header.scanline_size;
 3295|     23|		}
 3296|  6.15k|		else {
 3297|  6.15k|			header->read_scanlinewise = FALSE;
  ------------------
  |  |  206|  6.15k|#define FALSE   0               /* values of boolean */
  ------------------
 3298|  6.15k|			header->read_height = header->rows_per_strip;
 3299|  6.15k|			header->read_size = header->strip_size;
 3300|  6.15k|		}
 3301|       |
 3302|       |#ifdef DEBUG
 3303|       |		printf("rtiff_header_read: header.read_scanlinewise = %d\n",
 3304|       |			header->read_scanlinewise);
 3305|       |		printf("rtiff_header_read: header.read_height = %d\n",
 3306|       |			header->read_height);
 3307|       |		printf("rtiff_header_read: header.read_size = %zd\n",
 3308|       |			header->read_size);
 3309|       |#endif /*DEBUG*/
 3310|       |
 3311|       |		/* Stop some compiler warnings.
 3312|       |		 */
 3313|  6.17k|		header->tile_width = 0;
 3314|  6.17k|		header->tile_height = 0;
 3315|  6.17k|		header->tile_size = 0;
 3316|  6.17k|		header->tile_row_size = 0;
 3317|  6.17k|	}
 3318|       |
 3319|  7.82k|	TIFFGetFieldDefaulted(rtiff->tiff, TIFFTAG_EXTRASAMPLES,
  ------------------
  |  |  329|  7.82k|#define TIFFTAG_EXTRASAMPLES 338           /* !info about extra samples */
  ------------------
 3320|  7.82k|		&extra_samples_count, &extra_samples_types);
 3321|       |
 3322|  7.82k|	header->alpha_band = -1;
 3323|  7.82k|	if (extra_samples_count > 0) {
  ------------------
  |  Branch (3323:6): [True: 1.96k, False: 5.86k]
  ------------------
 3324|       |		/* There must be exactly one band which is
 3325|       |		 * EXTRASAMPLE_ASSOCALPHA. Note which one it is so we can
 3326|       |		 * unpremultiply with the right channel.
 3327|       |		 */
 3328|  1.96k|		int i;
 3329|       |
 3330|  86.3k|		for (i = 0; i < extra_samples_count; i++)
  ------------------
  |  Branch (3330:15): [True: 84.4k, False: 1.96k]
  ------------------
 3331|  84.4k|			if (extra_samples_types[i] == EXTRASAMPLE_ASSOCALPHA) {
  ------------------
  |  |  331|  84.4k|#define EXTRASAMPLE_ASSOCALPHA 1           /* !associated alpha data */
  ------------------
  |  Branch (3331:8): [True: 1.23k, False: 83.1k]
  ------------------
 3332|  1.23k|				if (header->alpha_band != -1)
  ------------------
  |  Branch (3332:9): [True: 0, False: 1.23k]
  ------------------
 3333|      0|					g_warning("%s", _("more than one alpha -- ignoring"));
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 3334|       |
 3335|  1.23k|				header->alpha_band = header->samples_per_pixel -
 3336|  1.23k|					extra_samples_count + i;
 3337|  1.23k|			}
 3338|  1.96k|	}
 3339|       |
 3340|  7.82k|	return 0;
 3341|  7.93k|}
tiff2vips.c:tfget32:
  475|  26.8k|{
  476|  26.8k|	guint32 fld;
  477|       |
  478|  26.8k|	if (!TIFFGetFieldDefaulted(tif, tag, &fld)) {
  ------------------
  |  Branch (478:6): [True: 0, False: 26.8k]
  ------------------
  479|      0|		vips_error("tiff2vips",
  480|      0|			_("required field %d missing"), tag);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  481|      0|		return 0;
  482|      0|	}
  483|       |
  484|  26.8k|	*out = fld;
  485|       |
  486|  26.8k|	return 1;
  487|  26.8k|}
tiff2vips.c:tfget16:
  493|  42.8k|{
  494|  42.8k|	guint16 fld;
  495|       |
  496|  42.8k|	if (!TIFFGetFieldDefaulted(tif, tag, &fld)) {
  ------------------
  |  Branch (496:6): [True: 582, False: 42.3k]
  ------------------
  497|    582|		vips_error("tiff2vips",
  498|    582|			_("required field %d missing"), tag);
  ------------------
  |  |   30|    582|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    582|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  499|    582|		return 0;
  500|    582|	}
  501|       |
  502|  42.3k|	*out = fld;
  503|       |
  504|  42.3k|	return 1;
  505|  42.8k|}
tiff2vips.c:get_sample_format:
  560|  7.93k|{
  561|  7.93k|	int sample_format;
  562|  7.93k|	guint16 v;
  563|       |
  564|  7.93k|	sample_format = SAMPLEFORMAT_INT;
  ------------------
  |  |  335|  7.93k|#define SAMPLEFORMAT_INT 2                 /* !signed integer data */
  ------------------
  565|       |
  566|  7.93k|	if (TIFFGetFieldDefaulted(tiff, TIFFTAG_SAMPLEFORMAT, &v)) {
  ------------------
  |  |  333|  7.93k|#define TIFFTAG_SAMPLEFORMAT 339           /* !data sample format */
  ------------------
  |  Branch (566:6): [True: 7.93k, False: 0]
  ------------------
  567|       |		/* Some images have this set to void, bizarre.
  568|       |		 */
  569|  7.93k|		if (v == SAMPLEFORMAT_VOID)
  ------------------
  |  |  337|  7.93k|#define SAMPLEFORMAT_VOID 4                /* !untyped data */
  ------------------
  |  Branch (569:7): [True: 7, False: 7.92k]
  ------------------
  570|      7|			v = SAMPLEFORMAT_UINT;
  ------------------
  |  |  334|      7|#define SAMPLEFORMAT_UINT 1                /* !unsigned integer data */
  ------------------
  571|       |
  572|  7.93k|		sample_format = v;
  573|  7.93k|	}
  574|       |
  575|  7.93k|	return sample_format;
  576|  7.93k|}
tiff2vips.c:get_orientation:
  580|  7.93k|{
  581|  7.93k|	int orientation;
  582|  7.93k|	guint16 v;
  583|       |
  584|  7.93k|	orientation = ORIENTATION_TOPLEFT;
  ------------------
  |  |  249|  7.93k|#define ORIENTATION_TOPLEFT 1              /* row 0 top, col 0 lhs */
  ------------------
  585|       |
  586|  7.93k|	if (TIFFGetFieldDefaulted(tiff, TIFFTAG_ORIENTATION, &v))
  ------------------
  |  |  248|  7.93k|#define TIFFTAG_ORIENTATION 274            /* +image orientation */
  ------------------
  |  Branch (586:6): [True: 7.93k, False: 0]
  ------------------
  587|       |		/* Can have mad values.
  588|       |		 */
  589|  7.93k|		orientation = VIPS_CLIP(1, v, 8);
  ------------------
  |  |   57|  7.93k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  15.8k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 7.93k]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 7.93k]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 7.93k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  590|       |
  591|  7.93k|	return orientation;
  592|  7.93k|}
tiff2vips.c:tfexists:
  462|  7.93k|{
  463|  7.93k|	guint32 a, b;
  464|       |
  465|  7.93k|	if (TIFFGetField(tif, tag, &a, &b))
  ------------------
  |  Branch (465:6): [True: 7.93k, False: 0]
  ------------------
  466|  7.93k|		return 1;
  467|      0|	else
  468|      0|		return 0;
  469|  7.93k|}
tiff2vips.c:rtiff_set_header:
 1852|  7.82k|{
 1853|  7.82k|	guint32 data_len;
 1854|  7.82k|	void *data;
 1855|       |
 1856|  7.82k|	rtiff_set_decode_format(rtiff);
 1857|       |
 1858|  7.82k|	if (rtiff->header.photometric_interpretation == PHOTOMETRIC_LOGLUV)
  ------------------
  |  |  233|  7.82k|#define PHOTOMETRIC_LOGLUV 32845           /* CIE Log2(L) (u',v') */
  ------------------
  |  Branch (1858:6): [True: 248, False: 7.57k]
  ------------------
 1859|    248|		vips_image_set_double(out, "stonits", rtiff->header.stonits);
 1860|       |
 1861|  7.82k|	out->Xsize = rtiff->header.width;
 1862|  7.82k|	out->Ysize = rtiff->header.height * rtiff->n;
 1863|       |
 1864|  7.82k|	VIPS_SETSTR(out->filename,
  ------------------
  |  |   53|  7.82k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  7.82k|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|  7.82k|	{ \
  |  |   55|  7.82k|		const char *sst = (V); \
  |  |   56|  7.82k|		\
  |  |   57|  7.82k|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 7.82k, False: 0]
  |  |  ------------------
  |  |   58|  7.82k|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 7.82k]
  |  |  |  Branch (58:16): [True: 7.82k, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|  7.82k|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|  7.82k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|  7.82k|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  7.82k|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|  7.82k|	{ \
  |  |  |  |  |  |   43|  7.82k|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 7.82k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  7.82k|			(void) F((S)); \
  |  |  |  |  |  |   45|  7.82k|			(S) = 0; \
  |  |  |  |  |  |   46|  7.82k|		} \
  |  |  |  |  |  |   47|  7.82k|	} \
  |  |  |  |  |  |   48|  7.82k|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|  7.82k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|  7.82k|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 7.82k]
  |  |  ------------------
  |  |   61|  7.82k|					(S) = g_strdup(sst); \
  |  |   62|  7.82k|			} \
  |  |   63|  7.82k|		} \
  |  |   64|  7.82k|	} \
  |  |   65|  7.82k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.82k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1865|  7.82k|		vips_connection_filename(VIPS_CONNECTION(rtiff->source)));
 1866|       |
 1867|  7.82k|	if (rtiff->n > 1)
  ------------------
  |  Branch (1867:6): [True: 0, False: 7.82k]
  ------------------
 1868|      0|		vips_image_set_int(out, VIPS_META_PAGE_HEIGHT, rtiff->header.height);
  ------------------
  |  |  158|      0|#define VIPS_META_PAGE_HEIGHT "page-height"
  ------------------
 1869|       |
 1870|  7.82k|	if (rtiff->header.subifd_count > 0)
  ------------------
  |  Branch (1870:6): [True: 7, False: 7.81k]
  ------------------
 1871|      7|		vips_image_set_int(out,
 1872|      7|			VIPS_META_N_SUBIFDS, rtiff->header.subifd_count);
  ------------------
  |  |  172|      7|#define VIPS_META_N_SUBIFDS "n-subifds"
  ------------------
 1873|       |
 1874|  7.82k|	vips_image_set_int(out, VIPS_META_N_PAGES, rtiff->n_pages);
  ------------------
  |  |  165|  7.82k|#define VIPS_META_N_PAGES "n-pages"
  ------------------
 1875|       |
 1876|       |	/* We have a range of output paths. Look at the tiff header and try to
 1877|       |	 * route the input image to the best output path.
 1878|       |	 */
 1879|  7.82k|	if (rtiff_pick_reader(rtiff)(rtiff, out))
  ------------------
  |  Branch (1879:6): [True: 150, False: 7.67k]
  ------------------
 1880|    150|		return -1;
 1881|       |
 1882|       |	/* Read any ICC profile.
 1883|       |	 */
 1884|  7.67k|	if (TIFFGetField(rtiff->tiff, TIFFTAG_ICCPROFILE, &data_len, &data))
  ------------------
  |  |  479|  7.67k|#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */
  ------------------
  |  Branch (1884:6): [True: 2, False: 7.67k]
  ------------------
 1885|      2|		vips_image_set_blob_copy(out, VIPS_META_ICC_NAME, data, data_len);
  ------------------
  |  |   78|      2|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
 1886|       |
 1887|       |	/* Read any XMP metadata.
 1888|       |	 */
 1889|  7.67k|	if (TIFFGetField(rtiff->tiff, TIFFTAG_XMLPACKET, &data_len, &data))
  ------------------
  |  |  394|  7.67k|#define TIFFTAG_XMLPACKET 700              /* %XML packet [Adobe XMP Specification, January 2004 */
  ------------------
  |  Branch (1889:6): [True: 4, False: 7.66k]
  ------------------
 1890|      4|		vips_image_set_blob_copy(out, VIPS_META_XMP_NAME, data, data_len);
  ------------------
  |  |   53|      4|#define VIPS_META_XMP_NAME "xmp-data"
  ------------------
 1891|       |
 1892|       |	/* Read any IPTC metadata.
 1893|       |	 */
 1894|  7.67k|	if (TIFFGetField(rtiff->tiff, TIFFTAG_RICHTIFFIPTC, &data_len, &data)) {
  ------------------
  |  |  448|  7.67k|#define TIFFTAG_RICHTIFFIPTC 33723
  ------------------
  |  Branch (1894:6): [True: 13, False: 7.66k]
  ------------------
 1895|     13|		vips_image_set_blob_copy(out, VIPS_META_IPTC_NAME, data, data_len);
  ------------------
  |  |   60|     13|#define VIPS_META_IPTC_NAME "iptc-data"
  ------------------
 1896|       |
 1897|       |		/* Older versions of libvips used this misspelt name :-( attach
 1898|       |		 * under this name too for compatibility.
 1899|       |		 */
 1900|     13|		vips_image_set_blob_copy(out, "ipct-data", data, data_len);
 1901|     13|	}
 1902|       |
 1903|       |	/* Read any photoshop metadata.
 1904|       |	 */
 1905|  7.67k|	if (TIFFGetField(rtiff->tiff, TIFFTAG_PHOTOSHOP, &data_len, &data))
  ------------------
  |  |  475|  7.67k|#define TIFFTAG_PHOTOSHOP 34377
  ------------------
  |  Branch (1905:6): [True: 0, False: 7.67k]
  ------------------
 1906|      0|		vips_image_set_blob_copy(out, VIPS_META_PHOTOSHOP_NAME, data, data_len);
  ------------------
  |  |   68|      0|#define VIPS_META_PHOTOSHOP_NAME "photoshop-data"
  ------------------
 1907|       |
 1908|  7.67k|	if (rtiff->header.image_description)
  ------------------
  |  Branch (1908:6): [True: 46, False: 7.62k]
  ------------------
 1909|     46|		vips_image_set_string(out, VIPS_META_IMAGEDESCRIPTION,
  ------------------
  |  |   85|     46|#define VIPS_META_IMAGEDESCRIPTION "image-description"
  ------------------
 1910|     46|			rtiff->header.image_description);
 1911|       |
 1912|  7.67k|	if (get_resolution(rtiff->tiff, out))
  ------------------
  |  Branch (1912:6): [True: 0, False: 7.67k]
  ------------------
 1913|      0|		return -1;
 1914|       |
 1915|  7.67k|	vips_image_set_int(out, VIPS_META_BITS_PER_SAMPLE,
  ------------------
  |  |  100|  7.67k|#define VIPS_META_BITS_PER_SAMPLE "bits-per-sample"
  ------------------
 1916|  7.67k|		rtiff->header.bits_per_sample);
 1917|       |
 1918|       |	/* Set the "orientation" tag. This is picked up later by autorot, if
 1919|       |	 * requested.
 1920|       |	 */
 1921|  7.67k|	vips_image_set_int(out, VIPS_META_ORIENTATION, rtiff->header.orientation);
  ------------------
  |  |  149|  7.67k|#define VIPS_META_ORIENTATION "orientation"
  ------------------
 1922|       |
 1923|       |	/* Hint smalltile for tiled images, since we may be decompressing
 1924|       |	 * outside the lock and THINSTRIP would prevent parallel tile decode.
 1925|       |	 */
 1926|  7.67k|	vips_image_pipelinev(out,
 1927|  7.67k|		rtiff->header.tiled
  ------------------
  |  Branch (1927:3): [True: 1.64k, False: 6.03k]
  ------------------
 1928|  7.67k|			? VIPS_DEMAND_STYLE_SMALLTILE
 1929|  7.67k|			: VIPS_DEMAND_STYLE_THINSTRIP,
 1930|  7.67k|		NULL);
 1931|       |
 1932|  7.67k|	return 0;
 1933|  7.67k|}
tiff2vips.c:rtiff_pick_reader:
 1804|  7.82k|{
 1805|  7.82k|	int bits_per_sample = rtiff->header.bits_per_sample;
 1806|  7.82k|	int photometric_interpretation =
 1807|  7.82k|		rtiff->header.photometric_interpretation;
 1808|  7.82k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1809|  7.82k|	int read_as_rgba = rtiff->header.read_as_rgba;
 1810|       |
 1811|  7.82k|	if (read_as_rgba)
  ------------------
  |  Branch (1811:6): [True: 2.69k, False: 5.13k]
  ------------------
 1812|  2.69k|		return rtiff_parse_rgba;
 1813|       |
 1814|  5.13k|	if (photometric_interpretation == PHOTOMETRIC_CIELAB) {
  ------------------
  |  |  228|  5.13k|#define PHOTOMETRIC_CIELAB 8               /* !1976 CIE L*a*b* */
  ------------------
  |  Branch (1814:6): [True: 150, False: 4.98k]
  ------------------
 1815|    150|		if (bits_per_sample == 8) {
  ------------------
  |  Branch (1815:7): [True: 127, False: 23]
  ------------------
 1816|    127|			if (samples_per_pixel > 3)
  ------------------
  |  Branch (1816:8): [True: 71, False: 56]
  ------------------
 1817|     71|				return rtiff_parse_lab_with_alpha;
 1818|     56|			else
 1819|     56|				return rtiff_parse_labpack;
 1820|    127|		}
 1821|     23|		if (bits_per_sample == 16)
  ------------------
  |  Branch (1821:7): [True: 17, False: 6]
  ------------------
 1822|     17|			return rtiff_parse_labs;
 1823|     23|	}
 1824|       |
 1825|  4.98k|	if (photometric_interpretation == PHOTOMETRIC_LOGLUV)
  ------------------
  |  |  233|  4.98k|#define PHOTOMETRIC_LOGLUV 32845           /* CIE Log2(L) (u',v') */
  ------------------
  |  Branch (1825:6): [True: 248, False: 4.73k]
  ------------------
 1826|    248|		return rtiff_parse_logluv;
 1827|       |
 1828|  4.73k|	if (photometric_interpretation == PHOTOMETRIC_MINISWHITE ||
  ------------------
  |  |  221|  9.47k|#define PHOTOMETRIC_MINISWHITE 0           /* min value is white */
  ------------------
  |  Branch (1828:6): [True: 1.99k, False: 2.74k]
  ------------------
 1829|  4.73k|		photometric_interpretation == PHOTOMETRIC_MINISBLACK) {
  ------------------
  |  |  222|  2.74k|#define PHOTOMETRIC_MINISBLACK 1           /* min value is black */
  ------------------
  |  Branch (1829:3): [True: 882, False: 1.86k]
  ------------------
 1830|       |
 1831|  2.87k|		if (bits_per_sample == 1)
  ------------------
  |  Branch (1831:7): [True: 1.66k, False: 1.21k]
  ------------------
 1832|  1.66k|			return rtiff_parse_onebit;
 1833|  1.21k|		else if (bits_per_sample == 2)
  ------------------
  |  Branch (1833:12): [True: 58, False: 1.15k]
  ------------------
 1834|     58|			return rtiff_parse_twobit;
 1835|  1.15k|		else if (bits_per_sample == 4)
  ------------------
  |  Branch (1835:12): [True: 106, False: 1.04k]
  ------------------
 1836|    106|			return rtiff_parse_fourbit;
 1837|  1.04k|		else
 1838|  1.04k|			return rtiff_parse_greyscale;
 1839|  2.87k|	}
 1840|       |
 1841|  1.86k|	if (photometric_interpretation == PHOTOMETRIC_PALETTE)
  ------------------
  |  |  224|  1.86k|#define PHOTOMETRIC_PALETTE 3              /* color map indexed */
  ------------------
  |  Branch (1841:6): [True: 205, False: 1.65k]
  ------------------
 1842|    205|		return rtiff_parse_palette;
 1843|       |
 1844|  1.65k|	return rtiff_parse_copy;
 1845|  1.86k|}
tiff2vips.c:rtiff_parse_rgba:
 1781|  2.69k|{
 1782|  2.69k|	out->Bands = 4;
 1783|  2.69k|	out->Type = VIPS_INTERPRETATION_sRGB;
 1784|  2.69k|	out->BandFmt = VIPS_FORMAT_UCHAR;
 1785|  2.69k|	out->Coding = VIPS_CODING_NONE;
 1786|       |
 1787|  2.69k|	rtiff->client = out;
 1788|       |
 1789|       |	/* We'll have RGBA areas of exact size as we need, so we can just copy it
 1790|       |	 */
 1791|  2.69k|	rtiff->sfn = rtiff_memcpy_line;
 1792|  2.69k|	rtiff->memcpy = TRUE;
  ------------------
  |  |  209|  2.69k|#define TRUE    1
  ------------------
 1793|       |
 1794|  2.69k|	return 0;
 1795|  2.69k|}
tiff2vips.c:rtiff_memcpy_line:
 1686|  12.6k|{
 1687|  12.6k|	VipsImage *im = (VipsImage *) client;
 1688|  12.6k|	size_t len = n * VIPS_IMAGE_SIZEOF_PEL(im);
  ------------------
  |  |  384|  12.6k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  12.6k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
 1689|       |
 1690|  12.6k|	memcpy(q, p, len);
 1691|  12.6k|}
tiff2vips.c:rtiff_parse_lab_with_alpha:
 1074|     71|{
 1075|     71|	if (rtiff_check_min_samples(rtiff, 4) ||
  ------------------
  |  Branch (1075:6): [True: 0, False: 71]
  ------------------
 1076|     71|		rtiff_check_bits(rtiff, 8) ||
  ------------------
  |  Branch (1076:3): [True: 0, False: 71]
  ------------------
 1077|     71|		rtiff_check_interpretation(rtiff, PHOTOMETRIC_CIELAB))
  ------------------
  |  |  228|     71|#define PHOTOMETRIC_CIELAB 8               /* !1976 CIE L*a*b* */
  ------------------
  |  Branch (1077:3): [True: 0, False: 71]
  ------------------
 1078|      0|		return -1;
 1079|       |
 1080|     71|	out->Bands = rtiff->header.samples_per_pixel;
 1081|     71|	out->BandFmt = VIPS_FORMAT_SHORT;
 1082|     71|	out->Coding = VIPS_CODING_NONE;
 1083|     71|	out->Type = VIPS_INTERPRETATION_LABS;
 1084|       |
 1085|     71|	rtiff->sfn = rtiff_lab_with_alpha_line;
 1086|       |
 1087|     71|	return 0;
 1088|     71|}
tiff2vips.c:rtiff_check_min_samples:
  878|  1.64k|{
  879|  1.64k|	if (rtiff->header.samples_per_pixel < samples_per_pixel) {
  ------------------
  |  Branch (879:6): [True: 3, False: 1.64k]
  ------------------
  880|      3|		vips_error("tiff2vips", _("not at least %d samples per pixel"),
  ------------------
  |  |   30|      3|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      3|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  881|      3|			samples_per_pixel);
  882|      3|		return -1;
  883|      3|	}
  884|       |
  885|  1.64k|	return 0;
  886|  1.64k|}
tiff2vips.c:rtiff_check_bits:
  918|  1.96k|{
  919|  1.96k|	if (rtiff->header.bits_per_sample != bits_per_sample) {
  ------------------
  |  Branch (919:6): [True: 0, False: 1.96k]
  ------------------
  920|      0|		vips_error("tiff2vips", _("not %d bits per sample"), bits_per_sample);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  921|      0|		return -1;
  922|      0|	}
  923|       |
  924|  1.96k|	return 0;
  925|  1.96k|}
tiff2vips.c:rtiff_check_interpretation:
  905|    389|{
  906|    389|	if (rtiff->header.photometric_interpretation !=
  ------------------
  |  Branch (906:6): [True: 0, False: 389]
  ------------------
  907|    389|		photometric_interpretation) {
  908|      0|		vips_error("tiff2vips", _("not photometric interpretation %d"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  909|      0|			photometric_interpretation);
  910|      0|		return -1;
  911|      0|	}
  912|       |
  913|    389|	return 0;
  914|    389|}
tiff2vips.c:rtiff_lab_with_alpha_line:
 1046|  1.12k|{
 1047|  1.12k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1048|       |
 1049|  1.12k|	unsigned char *p1;
 1050|  1.12k|	short *q1;
 1051|  1.12k|	int x;
 1052|       |
 1053|  1.12k|	p1 = (unsigned char *) p;
 1054|  1.12k|	q1 = (short *) q;
 1055|  46.2k|	for (x = 0; x < n; x++) {
  ------------------
  |  Branch (1055:14): [True: 45.1k, False: 1.12k]
  ------------------
 1056|  45.1k|		int i;
 1057|       |
 1058|  45.1k|		q1[0] = ((unsigned int) p1[0]) * 32767 / 255;
 1059|  45.1k|		q1[1] = ((short) p1[1]) << 8;
 1060|  45.1k|		q1[2] = ((short) p1[2]) << 8;
 1061|       |
 1062|  90.2k|		for (i = 3; i < samples_per_pixel; i++)
  ------------------
  |  Branch (1062:15): [True: 45.1k, False: 45.1k]
  ------------------
 1063|  45.1k|			q1[i] = (p1[i] << 8) + p1[i];
 1064|       |
 1065|  45.1k|		q1 += samples_per_pixel;
 1066|  45.1k|		p1 += samples_per_pixel;
 1067|  45.1k|	}
 1068|  1.12k|}
tiff2vips.c:rtiff_parse_labpack:
 1024|     56|{
 1025|     56|	if (rtiff_check_min_samples(rtiff, 3) ||
  ------------------
  |  Branch (1025:6): [True: 1, False: 55]
  ------------------
 1026|     56|		rtiff_check_bits(rtiff, 8) ||
  ------------------
  |  Branch (1026:3): [True: 0, False: 55]
  ------------------
 1027|     56|		rtiff_check_interpretation(rtiff, PHOTOMETRIC_CIELAB))
  ------------------
  |  |  228|     55|#define PHOTOMETRIC_CIELAB 8               /* !1976 CIE L*a*b* */
  ------------------
  |  Branch (1027:3): [True: 0, False: 55]
  ------------------
 1028|      1|		return -1;
 1029|       |
 1030|     55|	out->Bands = 4;
 1031|     55|	out->BandFmt = VIPS_FORMAT_UCHAR;
 1032|     55|	out->Coding = VIPS_CODING_LABQ;
 1033|     55|	out->Type = VIPS_INTERPRETATION_LAB;
 1034|       |
 1035|     55|	rtiff->sfn = rtiff_labpack_line;
 1036|       |
 1037|     55|	return 0;
 1038|     56|}
tiff2vips.c:rtiff_labpack_line:
 1004|    668|{
 1005|    668|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1006|       |
 1007|    668|	int x;
 1008|       |
 1009|  22.2k|	for (x = 0; x < n; x++) {
  ------------------
  |  Branch (1009:14): [True: 21.5k, False: 668]
  ------------------
 1010|  21.5k|		q[0] = p[0];
 1011|  21.5k|		q[1] = p[1];
 1012|  21.5k|		q[2] = p[2];
 1013|  21.5k|		q[3] = 0;
 1014|       |
 1015|  21.5k|		q += 4;
 1016|  21.5k|		p += samples_per_pixel;
 1017|  21.5k|	}
 1018|    668|}
tiff2vips.c:rtiff_parse_labs:
 1121|     17|{
 1122|     17|	if (rtiff_check_min_samples(rtiff, 3) ||
  ------------------
  |  Branch (1122:6): [True: 1, False: 16]
  ------------------
 1123|     17|		rtiff_check_bits(rtiff, 16) ||
  ------------------
  |  Branch (1123:3): [True: 0, False: 16]
  ------------------
 1124|     17|		rtiff_check_interpretation(rtiff, PHOTOMETRIC_CIELAB))
  ------------------
  |  |  228|     16|#define PHOTOMETRIC_CIELAB 8               /* !1976 CIE L*a*b* */
  ------------------
  |  Branch (1124:3): [True: 0, False: 16]
  ------------------
 1125|      1|		return -1;
 1126|       |
 1127|     16|	out->Bands = rtiff->header.samples_per_pixel;
 1128|     16|	out->BandFmt = VIPS_FORMAT_SHORT;
 1129|     16|	out->Coding = VIPS_CODING_NONE;
 1130|     16|	out->Type = VIPS_INTERPRETATION_LABS;
 1131|       |
 1132|     16|	rtiff->sfn = rtiff_labs_line;
 1133|       |
 1134|     16|	return 0;
 1135|     17|}
tiff2vips.c:rtiff_labs_line:
 1094|    280|{
 1095|    280|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1096|       |
 1097|    280|	unsigned short *p1;
 1098|    280|	short *q1;
 1099|    280|	int x;
 1100|    280|	int i;
 1101|       |
 1102|    280|	p1 = (unsigned short *) p;
 1103|    280|	q1 = (short *) q;
 1104|  1.52k|	for (x = 0; x < n; x++) {
  ------------------
  |  Branch (1104:14): [True: 1.24k, False: 280]
  ------------------
 1105|       |		/* We use signed int16 for L.
 1106|       |		 */
 1107|  1.24k|		q1[0] = p1[0] >> 1;
 1108|       |
 1109|  4.98k|		for (i = 1; i < samples_per_pixel; i++)
  ------------------
  |  Branch (1109:15): [True: 3.73k, False: 1.24k]
  ------------------
 1110|  3.73k|			q1[i] = p1[i];
 1111|       |
 1112|  1.24k|		q1 += samples_per_pixel;
 1113|  1.24k|		p1 += samples_per_pixel;
 1114|  1.24k|	}
 1115|    280|}
tiff2vips.c:rtiff_parse_logluv:
 1168|    248|{
 1169|    248|	if (rtiff_check_min_samples(rtiff, 3) ||
  ------------------
  |  Branch (1169:6): [True: 1, False: 247]
  ------------------
 1170|    248|		rtiff_check_interpretation(rtiff, PHOTOMETRIC_LOGLUV))
  ------------------
  |  |  233|    247|#define PHOTOMETRIC_LOGLUV 32845           /* CIE Log2(L) (u',v') */
  ------------------
  |  Branch (1170:3): [True: 0, False: 247]
  ------------------
 1171|      1|		return -1;
 1172|       |
 1173|    247|	out->Bands = rtiff->header.samples_per_pixel;
 1174|    247|	out->BandFmt = VIPS_FORMAT_FLOAT;
 1175|    247|	out->Coding = VIPS_CODING_NONE;
 1176|    247|	out->Type = VIPS_INTERPRETATION_XYZ;
 1177|       |
 1178|    247|	rtiff->sfn = rtiff_logluv_line;
 1179|       |
 1180|    247|	return 0;
 1181|    248|}
tiff2vips.c:rtiff_logluv_line:
 1141|  7.54k|{
 1142|  7.54k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1143|       |
 1144|  7.54k|	float *p1;
 1145|  7.54k|	float *q1;
 1146|  7.54k|	int x;
 1147|  7.54k|	int i;
 1148|       |
 1149|  7.54k|	p1 = (float *) p;
 1150|  7.54k|	q1 = (float *) q;
 1151|   299k|	for (x = 0; x < n; x++) {
  ------------------
  |  Branch (1151:14): [True: 292k, False: 7.54k]
  ------------------
 1152|   292k|		q1[0] = VIPS_D65_X0 * p1[0];
  ------------------
  |  |   58|   292k|#define VIPS_D65_X0 (95.0470)
  ------------------
 1153|   292k|		q1[1] = VIPS_D65_Y0 * p1[1];
  ------------------
  |  |   59|   292k|#define VIPS_D65_Y0 (100.0)
  ------------------
 1154|   292k|		q1[2] = VIPS_D65_Z0 * p1[2];
  ------------------
  |  |   60|   292k|#define VIPS_D65_Z0 (108.8827)
  ------------------
 1155|       |
 1156|   395k|		for (i = 3; i < samples_per_pixel; i++)
  ------------------
  |  Branch (1156:15): [True: 103k, False: 292k]
  ------------------
 1157|   103k|			q1[i] = p1[i];
 1158|       |
 1159|   292k|		q1 += samples_per_pixel;
 1160|   292k|		p1 += samples_per_pixel;
 1161|   292k|	}
 1162|  7.54k|}
tiff2vips.c:rtiff_parse_onebit:
 1252|  1.66k|{
 1253|  1.66k|	if (rtiff_check_samples(rtiff, 1) ||
  ------------------
  |  Branch (1253:6): [True: 5, False: 1.66k]
  ------------------
 1254|  1.66k|		rtiff_check_bits(rtiff, 1))
  ------------------
  |  Branch (1254:3): [True: 0, False: 1.66k]
  ------------------
 1255|      5|		return -1;
 1256|       |
 1257|  1.66k|	out->Bands = 1;
 1258|  1.66k|	out->BandFmt = VIPS_FORMAT_UCHAR;
 1259|  1.66k|	out->Coding = VIPS_CODING_NONE;
 1260|  1.66k|	out->Type = VIPS_INTERPRETATION_B_W;
 1261|       |
 1262|  1.66k|	rtiff->sfn = rtiff_1bit_line;
 1263|       |
 1264|  1.66k|	return 0;
 1265|  1.66k|}
tiff2vips.c:rtiff_check_samples:
  865|  1.83k|{
  866|  1.83k|	if (rtiff->header.samples_per_pixel != samples_per_pixel) {
  ------------------
  |  Branch (866:6): [True: 7, False: 1.82k]
  ------------------
  867|      7|		vips_error("tiff2vips", _("not %d bands"), samples_per_pixel);
  ------------------
  |  |   30|      7|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      7|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  868|      7|		return -1;
  869|      7|	}
  870|       |
  871|  1.82k|	return 0;
  872|  1.83k|}
tiff2vips.c:rtiff_1bit_line:
 1190|   309k|	{ \
 1191|   309k|		int photometric = rtiff->header.photometric_interpretation; \
 1192|   309k|		int mask = photometric == PHOTOMETRIC_MINISBLACK ? 0 : 0xff; \
  ------------------
  |  |  222|   309k|#define PHOTOMETRIC_MINISBLACK 1           /* min value is black */
  ------------------
  |  Branch (1192:14): [True: 12.5k, False: 296k]
  ------------------
 1193|   309k|		int bps = rtiff->header.bits_per_sample; \
 1194|   309k|		int load = 8 / bps - 1; \
 1195|   309k|\
 1196|   309k|		int x; \
 1197|   309k|		VipsPel bits; \
 1198|   309k|\
 1199|   309k|		/* Stop a compiler warning. \
 1200|   309k|		 */ \
 1201|   309k|		bits = 0; \
 1202|   309k|\
 1203|  6.42M|		for (x = 0; x < n; x++) { \
  ------------------
  |  Branch (1203:15): [True: 6.11M, False: 309k]
  ------------------
 1204|  6.11M|			if ((x & load) == 0) \
  ------------------
  |  Branch (1204:8): [True: 808k, False: 5.30M]
  ------------------
 1205|  6.11M|				/* Flip the bits for miniswhite. \
 1206|  6.11M|				 */ \
 1207|  6.11M|				bits = *p++ ^ mask; \
 1208|  6.11M|\
 1209|  6.11M|			EXPAND(q[x], bits); \
  ------------------
  |  | 1244|  6.11M|NBIT_LINE(1, EXPAND1)
  |  |  ------------------
  |  |  |  | 1218|  6.11M|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  6.11M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  | 1219|  6.11M|	{ \
  |  |  |  | 1220|  6.11M|		(Q) = (((signed char) (BITS & 128)) >> 7); \
  |  |  |  | 1221|  6.11M|	} \
  |  |  |  | 1222|  6.11M|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  6.11M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1210|  6.11M|\
 1211|  6.11M|			bits <<= bps; \
 1212|  6.11M|		} \
 1213|   309k|	}
tiff2vips.c:rtiff_parse_twobit:
 1271|     58|{
 1272|     58|	if (rtiff_check_samples(rtiff, 1) ||
  ------------------
  |  Branch (1272:6): [True: 1, False: 57]
  ------------------
 1273|     58|		rtiff_check_bits(rtiff, 2))
  ------------------
  |  Branch (1273:3): [True: 0, False: 57]
  ------------------
 1274|      1|		return -1;
 1275|       |
 1276|     57|	out->Bands = 1;
 1277|     57|	out->BandFmt = VIPS_FORMAT_UCHAR;
 1278|     57|	out->Coding = VIPS_CODING_NONE;
 1279|     57|	out->Type = VIPS_INTERPRETATION_B_W;
 1280|       |
 1281|     57|	rtiff->sfn = rtiff_2bit_line;
 1282|       |
 1283|     57|	return 0;
 1284|     58|}
tiff2vips.c:rtiff_2bit_line:
 1190|  2.33k|	{ \
 1191|  2.33k|		int photometric = rtiff->header.photometric_interpretation; \
 1192|  2.33k|		int mask = photometric == PHOTOMETRIC_MINISBLACK ? 0 : 0xff; \
  ------------------
  |  |  222|  2.33k|#define PHOTOMETRIC_MINISBLACK 1           /* min value is black */
  ------------------
  |  Branch (1192:14): [True: 0, False: 2.33k]
  ------------------
 1193|  2.33k|		int bps = rtiff->header.bits_per_sample; \
 1194|  2.33k|		int load = 8 / bps - 1; \
 1195|  2.33k|\
 1196|  2.33k|		int x; \
 1197|  2.33k|		VipsPel bits; \
 1198|  2.33k|\
 1199|  2.33k|		/* Stop a compiler warning. \
 1200|  2.33k|		 */ \
 1201|  2.33k|		bits = 0; \
 1202|  2.33k|\
 1203|  85.4k|		for (x = 0; x < n; x++) { \
  ------------------
  |  Branch (1203:15): [True: 83.1k, False: 2.33k]
  ------------------
 1204|  83.1k|			if ((x & load) == 0) \
  ------------------
  |  Branch (1204:8): [True: 21.2k, False: 61.8k]
  ------------------
 1205|  83.1k|				/* Flip the bits for miniswhite. \
 1206|  83.1k|				 */ \
 1207|  83.1k|				bits = *p++ ^ mask; \
 1208|  83.1k|\
 1209|  83.1k|			EXPAND(q[x], bits); \
  ------------------
  |  | 1245|  83.1k|NBIT_LINE(2, EXPAND2)
  |  |  ------------------
  |  |  |  | 1227|  83.1k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  83.1k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  | 1228|  83.1k|	{ \
  |  |  |  | 1229|  83.1k|		VipsPel twobits = BITS >> 6; \
  |  |  |  | 1230|  83.1k|		VipsPel fourbits = twobits | (twobits << 2); \
  |  |  |  | 1231|  83.1k|		Q = fourbits | (fourbits << 4); \
  |  |  |  | 1232|  83.1k|	} \
  |  |  |  | 1233|  83.1k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  83.1k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1210|  83.1k|\
 1211|  83.1k|			bits <<= bps; \
 1212|  83.1k|		} \
 1213|  2.33k|	}
tiff2vips.c:rtiff_parse_fourbit:
 1290|    106|{
 1291|    106|	if (rtiff_check_samples(rtiff, 1) ||
  ------------------
  |  Branch (1291:6): [True: 1, False: 105]
  ------------------
 1292|    106|		rtiff_check_bits(rtiff, 4))
  ------------------
  |  Branch (1292:3): [True: 0, False: 105]
  ------------------
 1293|      1|		return -1;
 1294|       |
 1295|    105|	out->Bands = 1;
 1296|    105|	out->BandFmt = VIPS_FORMAT_UCHAR;
 1297|    105|	out->Coding = VIPS_CODING_NONE;
 1298|    105|	out->Type = VIPS_INTERPRETATION_B_W;
 1299|       |
 1300|    105|	rtiff->sfn = rtiff_4bit_line;
 1301|       |
 1302|    105|	return 0;
 1303|    106|}
tiff2vips.c:rtiff_4bit_line:
 1190|  4.75k|	{ \
 1191|  4.75k|		int photometric = rtiff->header.photometric_interpretation; \
 1192|  4.75k|		int mask = photometric == PHOTOMETRIC_MINISBLACK ? 0 : 0xff; \
  ------------------
  |  |  222|  4.75k|#define PHOTOMETRIC_MINISBLACK 1           /* min value is black */
  ------------------
  |  Branch (1192:14): [True: 0, False: 4.75k]
  ------------------
 1193|  4.75k|		int bps = rtiff->header.bits_per_sample; \
 1194|  4.75k|		int load = 8 / bps - 1; \
 1195|  4.75k|\
 1196|  4.75k|		int x; \
 1197|  4.75k|		VipsPel bits; \
 1198|  4.75k|\
 1199|  4.75k|		/* Stop a compiler warning. \
 1200|  4.75k|		 */ \
 1201|  4.75k|		bits = 0; \
 1202|  4.75k|\
 1203|   269k|		for (x = 0; x < n; x++) { \
  ------------------
  |  Branch (1203:15): [True: 265k, False: 4.75k]
  ------------------
 1204|   265k|			if ((x & load) == 0) \
  ------------------
  |  Branch (1204:8): [True: 134k, False: 130k]
  ------------------
 1205|   265k|				/* Flip the bits for miniswhite. \
 1206|   265k|				 */ \
 1207|   265k|				bits = *p++ ^ mask; \
 1208|   265k|\
 1209|   265k|			EXPAND(q[x], bits); \
  ------------------
  |  | 1246|   265k|NBIT_LINE(4, EXPAND4)
  |  |  ------------------
  |  |  |  | 1238|   265k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   265k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  | 1239|   265k|	{ \
  |  |  |  | 1240|   265k|		Q = (BITS & 0xf0) | (BITS >> 4); \
  |  |  |  | 1241|   265k|	} \
  |  |  |  | 1242|   265k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   265k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1210|   265k|\
 1211|   265k|			bits <<= bps; \
 1212|   265k|		} \
 1213|  4.75k|	}
tiff2vips.c:rtiff_parse_greyscale:
 1419|  1.04k|{
 1420|  1.04k|	if (rtiff_check_min_samples(rtiff, 1) ||
  ------------------
  |  Branch (1420:6): [True: 0, False: 1.04k]
  ------------------
 1421|  1.04k|		rtiff_non_fractional(rtiff))
  ------------------
  |  Branch (1421:3): [True: 2, False: 1.04k]
  ------------------
 1422|      2|		return -1;
 1423|       |
 1424|  1.04k|	out->Bands = rtiff->header.samples_per_pixel;
 1425|  1.04k|	out->BandFmt = rtiff_guess_format(rtiff);
 1426|  1.04k|	if (out->BandFmt == VIPS_FORMAT_NOTSET)
  ------------------
  |  Branch (1426:6): [True: 1, False: 1.04k]
  ------------------
 1427|      1|		return -1;
 1428|  1.04k|	out->Coding = VIPS_CODING_NONE;
 1429|       |
 1430|  1.04k|	if (rtiff->header.bits_per_sample == 16)
  ------------------
  |  Branch (1430:6): [True: 336, False: 709]
  ------------------
 1431|    336|		out->Type = VIPS_INTERPRETATION_GREY16;
 1432|    709|	else
 1433|    709|		out->Type = VIPS_INTERPRETATION_B_W;
 1434|       |
 1435|       |	/* rtiff_greyscale_line() doesn't do complex.
 1436|       |	 */
 1437|  1.04k|	if (vips_check_noncomplex("tiff2vips", out))
  ------------------
  |  Branch (1437:6): [True: 0, False: 1.04k]
  ------------------
 1438|      0|		return -1;
 1439|       |
 1440|  1.04k|	rtiff->sfn = rtiff_greyscale_line;
 1441|       |
 1442|  1.04k|	return 0;
 1443|  1.04k|}
tiff2vips.c:rtiff_non_fractional:
  892|  2.70k|{
  893|  2.70k|	if (rtiff->header.bits_per_sample % 8 != 0 ||
  ------------------
  |  Branch (893:6): [True: 138, False: 2.56k]
  ------------------
  894|  2.70k|		rtiff->header.bits_per_sample == 0) {
  ------------------
  |  Branch (894:3): [True: 0, False: 2.56k]
  ------------------
  895|    138|		vips_error("tiff2vips", "%s", _("samples_per_pixel "
  ------------------
  |  |   30|    138|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    138|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  896|    138|										"not a whole number of bytes"));
  897|    138|		return -1;
  898|    138|	}
  899|       |
  900|  2.56k|	return 0;
  901|  2.70k|}
tiff2vips.c:rtiff_guess_format:
  946|  19.8k|{
  947|  19.8k|	int bits_per_sample = rtiff->header.bits_per_sample;
  948|  19.8k|	int sample_format = rtiff->header.sample_format;
  949|       |
  950|  19.8k|	switch (bits_per_sample) {
  951|      0|	case 1:
  ------------------
  |  Branch (951:2): [True: 0, False: 19.8k]
  ------------------
  952|      0|	case 2:
  ------------------
  |  Branch (952:2): [True: 0, False: 19.8k]
  ------------------
  953|      0|	case 4:
  ------------------
  |  Branch (953:2): [True: 0, False: 19.8k]
  ------------------
  954|  8.08k|	case 8:
  ------------------
  |  Branch (954:2): [True: 8.08k, False: 11.7k]
  ------------------
  955|  8.08k|		if (sample_format == SAMPLEFORMAT_INT)
  ------------------
  |  |  335|  8.08k|#define SAMPLEFORMAT_INT 2                 /* !signed integer data */
  ------------------
  |  Branch (955:7): [True: 1.43k, False: 6.65k]
  ------------------
  956|  1.43k|			return VIPS_FORMAT_CHAR;
  957|  6.65k|		if (sample_format == SAMPLEFORMAT_UINT)
  ------------------
  |  |  334|  6.65k|#define SAMPLEFORMAT_UINT 1                /* !unsigned integer data */
  ------------------
  |  Branch (957:7): [True: 6.64k, False: 1]
  ------------------
  958|  6.64k|			return VIPS_FORMAT_UCHAR;
  959|      1|		break;
  960|       |
  961|  5.52k|	case 16:
  ------------------
  |  Branch (961:2): [True: 5.52k, False: 14.2k]
  ------------------
  962|  5.52k|		if (sample_format == SAMPLEFORMAT_INT)
  ------------------
  |  |  335|  5.52k|#define SAMPLEFORMAT_INT 2                 /* !signed integer data */
  ------------------
  |  Branch (962:7): [True: 263, False: 5.25k]
  ------------------
  963|    263|			return VIPS_FORMAT_SHORT;
  964|  5.25k|		if (sample_format == SAMPLEFORMAT_UINT)
  ------------------
  |  |  334|  5.25k|#define SAMPLEFORMAT_UINT 1                /* !unsigned integer data */
  ------------------
  |  Branch (964:7): [True: 3.26k, False: 1.98k]
  ------------------
  965|  3.26k|			return VIPS_FORMAT_USHORT;
  966|  1.98k|		if (sample_format == SAMPLEFORMAT_IEEEFP)
  ------------------
  |  |  336|  1.98k|#define SAMPLEFORMAT_IEEEFP 3              /* !IEEE floating point data */
  ------------------
  |  Branch (966:7): [True: 1.98k, False: 0]
  ------------------
  967|  1.98k|			return VIPS_FORMAT_FLOAT;
  968|      0|		break;
  969|       |
  970|  6.21k|	case 32:
  ------------------
  |  Branch (970:2): [True: 6.21k, False: 13.6k]
  ------------------
  971|  6.21k|		if (sample_format == SAMPLEFORMAT_INT)
  ------------------
  |  |  335|  6.21k|#define SAMPLEFORMAT_INT 2                 /* !signed integer data */
  ------------------
  |  Branch (971:7): [True: 1.36k, False: 4.84k]
  ------------------
  972|  1.36k|			return VIPS_FORMAT_INT;
  973|  4.84k|		if (sample_format == SAMPLEFORMAT_UINT)
  ------------------
  |  |  334|  4.84k|#define SAMPLEFORMAT_UINT 1                /* !unsigned integer data */
  ------------------
  |  Branch (973:7): [True: 2.55k, False: 2.29k]
  ------------------
  974|  2.55k|			return VIPS_FORMAT_UINT;
  975|  2.29k|		if (sample_format == SAMPLEFORMAT_IEEEFP)
  ------------------
  |  |  336|  2.29k|#define SAMPLEFORMAT_IEEEFP 3              /* !IEEE floating point data */
  ------------------
  |  Branch (975:7): [True: 2.29k, False: 0]
  ------------------
  976|  2.29k|			return VIPS_FORMAT_FLOAT;
  977|      0|		break;
  978|       |
  979|      0|	case 64:
  ------------------
  |  Branch (979:2): [True: 0, False: 19.8k]
  ------------------
  980|      0|		if (sample_format == SAMPLEFORMAT_IEEEFP)
  ------------------
  |  |  336|      0|#define SAMPLEFORMAT_IEEEFP 3              /* !IEEE floating point data */
  ------------------
  |  Branch (980:7): [True: 0, False: 0]
  ------------------
  981|      0|			return VIPS_FORMAT_DOUBLE;
  982|      0|		if (sample_format == SAMPLEFORMAT_COMPLEXIEEEFP)
  ------------------
  |  |  339|      0|#define SAMPLEFORMAT_COMPLEXIEEEFP 6       /* !complex ieee floating */
  ------------------
  |  Branch (982:7): [True: 0, False: 0]
  ------------------
  983|      0|			return VIPS_FORMAT_COMPLEX;
  984|      0|		break;
  985|       |
  986|      0|	case 128:
  ------------------
  |  Branch (986:2): [True: 0, False: 19.8k]
  ------------------
  987|      0|		if (sample_format == SAMPLEFORMAT_COMPLEXIEEEFP)
  ------------------
  |  |  339|      0|#define SAMPLEFORMAT_COMPLEXIEEEFP 6       /* !complex ieee floating */
  ------------------
  |  Branch (987:7): [True: 0, False: 0]
  ------------------
  988|      0|			return VIPS_FORMAT_DPCOMPLEX;
  989|      0|		break;
  990|       |
  991|      1|	default:
  ------------------
  |  Branch (991:2): [True: 1, False: 19.8k]
  ------------------
  992|      1|		break;
  993|  19.8k|	}
  994|       |
  995|      2|	vips_error("tiff2vips", "%s", _("unsupported tiff image type\n"));
  ------------------
  |  |   30|      2|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      2|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  996|       |
  997|      2|	return VIPS_FORMAT_NOTSET;
  998|  19.8k|}
tiff2vips.c:rtiff_greyscale_line:
 1356|  17.2k|{
 1357|  17.2k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1358|  17.2k|	int bits_per_sample = rtiff->header.bits_per_sample;
 1359|  17.2k|	int photometric_interpretation =
 1360|  17.2k|		rtiff->header.photometric_interpretation;
 1361|  17.2k|	VipsBandFormat format = rtiff_guess_format(rtiff);
 1362|       |
 1363|       |	/* Swapping black and white doesn't make sense for the signed formats.
 1364|       |	 */
 1365|  17.2k|	gboolean invert =
 1366|  17.2k|		photometric_interpretation == PHOTOMETRIC_MINISWHITE &&
  ------------------
  |  |  221|  34.5k|#define PHOTOMETRIC_MINISWHITE 0           /* min value is white */
  ------------------
  |  Branch (1366:3): [True: 11.2k, False: 6.02k]
  ------------------
 1367|  17.2k|		vips_band_format_isuint(format);
  ------------------
  |  Branch (1367:3): [True: 6.25k, False: 4.97k]
  ------------------
 1368|       |
 1369|  17.2k|	int x, i;
 1370|       |
 1371|  17.2k|	switch (format) {
 1372|  1.30k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (1372:2): [True: 1.30k, False: 15.9k]
  ------------------
 1373|  1.30k|		GREY_LOOP(gchar, 0);
  ------------------
  |  | 1308|  1.30k|	{ \
  |  | 1309|  1.30k|		TYPE *p1; \
  |  | 1310|  1.30k|		TYPE *q1; \
  |  | 1311|  1.30k|\
  |  | 1312|  1.30k|		p1 = (TYPE *) p; \
  |  | 1313|  1.30k|		q1 = (TYPE *) q; \
  |  | 1314|  60.5k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 59.2k, False: 1.30k]
  |  |  ------------------
  |  | 1315|  59.2k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 0, False: 59.2k]
  |  |  ------------------
  |  | 1316|  59.2k|				q1[0] = MAX - p1[0]; \
  |  | 1317|  59.2k|			else \
  |  | 1318|  59.2k|				q1[0] = p1[0]; \
  |  | 1319|  59.2k|\
  |  | 1320|   180k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 121k, False: 59.2k]
  |  |  ------------------
  |  | 1321|   121k|				q1[i] = p1[i]; \
  |  | 1322|  59.2k|\
  |  | 1323|  59.2k|			q1 += samples_per_pixel; \
  |  | 1324|  59.2k|			p1 += samples_per_pixel; \
  |  | 1325|  59.2k|		} \
  |  | 1326|  1.30k|	}
  ------------------
 1374|  1.30k|		break;
 1375|       |
 1376|  5.74k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (1376:2): [True: 5.74k, False: 11.5k]
  ------------------
 1377|  5.74k|		GREY_LOOP(guchar, UCHAR_MAX);
  ------------------
  |  | 1308|  5.74k|	{ \
  |  | 1309|  5.74k|		TYPE *p1; \
  |  | 1310|  5.74k|		TYPE *q1; \
  |  | 1311|  5.74k|\
  |  | 1312|  5.74k|		p1 = (TYPE *) p; \
  |  | 1313|  5.74k|		q1 = (TYPE *) q; \
  |  | 1314|   104k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 99.2k, False: 5.74k]
  |  |  ------------------
  |  | 1315|  99.2k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 73.7k, False: 25.4k]
  |  |  ------------------
  |  | 1316|  99.2k|				q1[0] = MAX - p1[0]; \
  |  | 1317|  99.2k|			else \
  |  | 1318|  99.2k|				q1[0] = p1[0]; \
  |  | 1319|  99.2k|\
  |  | 1320|   156k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 57.2k, False: 99.2k]
  |  |  ------------------
  |  | 1321|  99.2k|				q1[i] = p1[i]; \
  |  | 1322|  99.2k|\
  |  | 1323|  99.2k|			q1 += samples_per_pixel; \
  |  | 1324|  99.2k|			p1 += samples_per_pixel; \
  |  | 1325|  99.2k|		} \
  |  | 1326|  5.74k|	}
  ------------------
 1378|  5.74k|		break;
 1379|       |
 1380|    169|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (1380:2): [True: 169, False: 17.0k]
  ------------------
 1381|    169|		GREY_LOOP(gshort, 0);
  ------------------
  |  | 1308|    169|	{ \
  |  | 1309|    169|		TYPE *p1; \
  |  | 1310|    169|		TYPE *q1; \
  |  | 1311|    169|\
  |  | 1312|    169|		p1 = (TYPE *) p; \
  |  | 1313|    169|		q1 = (TYPE *) q; \
  |  | 1314|  10.2k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 10.0k, False: 169]
  |  |  ------------------
  |  | 1315|  10.0k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 0, False: 10.0k]
  |  |  ------------------
  |  | 1316|  10.0k|				q1[0] = MAX - p1[0]; \
  |  | 1317|  10.0k|			else \
  |  | 1318|  10.0k|				q1[0] = p1[0]; \
  |  | 1319|  10.0k|\
  |  | 1320|  38.2k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 28.1k, False: 10.0k]
  |  |  ------------------
  |  | 1321|  28.1k|				q1[i] = p1[i]; \
  |  | 1322|  10.0k|\
  |  | 1323|  10.0k|			q1 += samples_per_pixel; \
  |  | 1324|  10.0k|			p1 += samples_per_pixel; \
  |  | 1325|  10.0k|		} \
  |  | 1326|    169|	}
  ------------------
 1382|    169|		break;
 1383|       |
 1384|  2.71k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (1384:2): [True: 2.71k, False: 14.5k]
  ------------------
 1385|  2.71k|		GREY_LOOP(gushort, USHRT_MAX);
  ------------------
  |  | 1308|  2.71k|	{ \
  |  | 1309|  2.71k|		TYPE *p1; \
  |  | 1310|  2.71k|		TYPE *q1; \
  |  | 1311|  2.71k|\
  |  | 1312|  2.71k|		p1 = (TYPE *) p; \
  |  | 1313|  2.71k|		q1 = (TYPE *) q; \
  |  | 1314|  91.2k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 88.5k, False: 2.71k]
  |  |  ------------------
  |  | 1315|  88.5k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 21.8k, False: 66.6k]
  |  |  ------------------
  |  | 1316|  88.5k|				q1[0] = MAX - p1[0]; \
  |  | 1317|  88.5k|			else \
  |  | 1318|  88.5k|				q1[0] = p1[0]; \
  |  | 1319|  88.5k|\
  |  | 1320|   140k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 51.6k, False: 88.5k]
  |  |  ------------------
  |  | 1321|  88.5k|				q1[i] = p1[i]; \
  |  | 1322|  88.5k|\
  |  | 1323|  88.5k|			q1 += samples_per_pixel; \
  |  | 1324|  88.5k|			p1 += samples_per_pixel; \
  |  | 1325|  88.5k|		} \
  |  | 1326|  2.71k|	}
  ------------------
 1386|  2.71k|		break;
 1387|       |
 1388|  1.18k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (1388:2): [True: 1.18k, False: 16.0k]
  ------------------
 1389|  1.18k|		GREY_LOOP(gint, 0);
  ------------------
  |  | 1308|  1.18k|	{ \
  |  | 1309|  1.18k|		TYPE *p1; \
  |  | 1310|  1.18k|		TYPE *q1; \
  |  | 1311|  1.18k|\
  |  | 1312|  1.18k|		p1 = (TYPE *) p; \
  |  | 1313|  1.18k|		q1 = (TYPE *) q; \
  |  | 1314|  12.5k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 11.3k, False: 1.18k]
  |  |  ------------------
  |  | 1315|  11.3k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 0, False: 11.3k]
  |  |  ------------------
  |  | 1316|  11.3k|				q1[0] = MAX - p1[0]; \
  |  | 1317|  11.3k|			else \
  |  | 1318|  11.3k|				q1[0] = p1[0]; \
  |  | 1319|  11.3k|\
  |  | 1320|  37.3k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 26.0k, False: 11.3k]
  |  |  ------------------
  |  | 1321|  26.0k|				q1[i] = p1[i]; \
  |  | 1322|  11.3k|\
  |  | 1323|  11.3k|			q1 += samples_per_pixel; \
  |  | 1324|  11.3k|			p1 += samples_per_pixel; \
  |  | 1325|  11.3k|		} \
  |  | 1326|  1.18k|	}
  ------------------
 1390|  1.18k|		break;
 1391|       |
 1392|  2.23k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (1392:2): [True: 2.23k, False: 15.0k]
  ------------------
 1393|  2.23k|		GREY_LOOP(guint, UINT_MAX);
  ------------------
  |  | 1308|  2.23k|	{ \
  |  | 1309|  2.23k|		TYPE *p1; \
  |  | 1310|  2.23k|		TYPE *q1; \
  |  | 1311|  2.23k|\
  |  | 1312|  2.23k|		p1 = (TYPE *) p; \
  |  | 1313|  2.23k|		q1 = (TYPE *) q; \
  |  | 1314|  46.8k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 44.6k, False: 2.23k]
  |  |  ------------------
  |  | 1315|  44.6k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 13.3k, False: 31.3k]
  |  |  ------------------
  |  | 1316|  44.6k|				q1[0] = MAX - p1[0]; \
  |  | 1317|  44.6k|			else \
  |  | 1318|  44.6k|				q1[0] = p1[0]; \
  |  | 1319|  44.6k|\
  |  | 1320|   102k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 58.0k, False: 44.6k]
  |  |  ------------------
  |  | 1321|  58.0k|				q1[i] = p1[i]; \
  |  | 1322|  44.6k|\
  |  | 1323|  44.6k|			q1 += samples_per_pixel; \
  |  | 1324|  44.6k|			p1 += samples_per_pixel; \
  |  | 1325|  44.6k|		} \
  |  | 1326|  2.23k|	}
  ------------------
 1394|  2.23k|		break;
 1395|       |
 1396|  3.90k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (1396:2): [True: 3.90k, False: 13.3k]
  ------------------
 1397|  3.90k|		if (bits_per_sample == 16) {
  ------------------
  |  Branch (1397:7): [True: 1.81k, False: 2.08k]
  ------------------
 1398|  1.81k|			GREY_LOOP_F16;
  ------------------
  |  | 1331|  1.81k|	{ \
  |  | 1332|  1.81k|		gushort *p1; \
  |  | 1333|  1.81k|		float *q1; \
  |  | 1334|  1.81k|\
  |  | 1335|  1.81k|		p1 = (gushort *) p; \
  |  | 1336|  1.81k|		q1 = (float *) q; \
  |  | 1337|  35.0k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1337:15): [True: 33.2k, False: 1.81k]
  |  |  ------------------
  |  | 1338|  33.2k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1338:8): [True: 0, False: 33.2k]
  |  |  ------------------
  |  | 1339|  33.2k|				q1[0] = 1.0 - half_2_float(p1[0]); \
  |  | 1340|  33.2k|			else \
  |  | 1341|  33.2k|				q1[0] = half_2_float(p1[0]); \
  |  | 1342|  33.2k|\
  |  | 1343|   100k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1343:16): [True: 67.5k, False: 33.2k]
  |  |  ------------------
  |  | 1344|  67.5k|				q1[i] = half_2_float(p1[i]); \
  |  | 1345|  33.2k|\
  |  | 1346|  33.2k|			q1 += samples_per_pixel; \
  |  | 1347|  33.2k|			p1 += samples_per_pixel; \
  |  | 1348|  33.2k|		} \
  |  | 1349|  1.81k|	}
  ------------------
 1399|  1.81k|		}
 1400|  2.08k|		else {
 1401|  2.08k|			GREY_LOOP(float, 1.0);
  ------------------
  |  | 1308|  2.08k|	{ \
  |  | 1309|  2.08k|		TYPE *p1; \
  |  | 1310|  2.08k|		TYPE *q1; \
  |  | 1311|  2.08k|\
  |  | 1312|  2.08k|		p1 = (TYPE *) p; \
  |  | 1313|  2.08k|		q1 = (TYPE *) q; \
  |  | 1314|  40.2k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 38.1k, False: 2.08k]
  |  |  ------------------
  |  | 1315|  38.1k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 0, False: 38.1k]
  |  |  ------------------
  |  | 1316|  38.1k|				q1[0] = MAX - p1[0]; \
  |  | 1317|  38.1k|			else \
  |  | 1318|  38.1k|				q1[0] = p1[0]; \
  |  | 1319|  38.1k|\
  |  | 1320|  98.7k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 60.6k, False: 38.1k]
  |  |  ------------------
  |  | 1321|  60.6k|				q1[i] = p1[i]; \
  |  | 1322|  38.1k|\
  |  | 1323|  38.1k|			q1 += samples_per_pixel; \
  |  | 1324|  38.1k|			p1 += samples_per_pixel; \
  |  | 1325|  38.1k|		} \
  |  | 1326|  2.08k|	}
  ------------------
 1402|  2.08k|		}
 1403|  3.90k|		break;
 1404|       |
 1405|      0|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (1405:2): [True: 0, False: 17.2k]
  ------------------
 1406|      0|		GREY_LOOP(double, 1.0);
  ------------------
  |  | 1308|      0|	{ \
  |  | 1309|      0|		TYPE *p1; \
  |  | 1310|      0|		TYPE *q1; \
  |  | 1311|      0|\
  |  | 1312|      0|		p1 = (TYPE *) p; \
  |  | 1313|      0|		q1 = (TYPE *) q; \
  |  | 1314|      0|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 0, False: 0]
  |  |  ------------------
  |  | 1315|      0|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 0, False: 0]
  |  |  ------------------
  |  | 1316|      0|				q1[0] = MAX - p1[0]; \
  |  | 1317|      0|			else \
  |  | 1318|      0|				q1[0] = p1[0]; \
  |  | 1319|      0|\
  |  | 1320|      0|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 0, False: 0]
  |  |  ------------------
  |  | 1321|      0|				q1[i] = p1[i]; \
  |  | 1322|      0|\
  |  | 1323|      0|			q1 += samples_per_pixel; \
  |  | 1324|      0|			p1 += samples_per_pixel; \
  |  | 1325|      0|		} \
  |  | 1326|      0|	}
  ------------------
 1407|      0|		break;
 1408|       |
 1409|      0|	default:
  ------------------
  |  Branch (1409:2): [True: 0, False: 17.2k]
  ------------------
 1410|      0|		g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1411|  17.2k|	}
 1412|  17.2k|}
tiff2vips.c:half_2_float:
  441|   879k|{
  442|   879k|	const float sign = (h >> 15) * -2 + 1;
  443|   879k|	const int exp = ((h & 0x7C00) >> 10) - 15;
  444|   879k|	const float prec = (h & 0x03FF);
  445|       |
  446|   879k|	switch (exp) {
  447|  66.3k|	case 16:
  ------------------
  |  Branch (447:2): [True: 66.3k, False: 813k]
  ------------------
  448|  66.3k|		return INFINITY * sign;
  449|   617k|	case -15:
  ------------------
  |  Branch (449:2): [True: 617k, False: 262k]
  ------------------
  450|   617k|		return sign / (float) (1 << 14) * (prec / 1024.0);
  451|   196k|	default:
  ------------------
  |  Branch (451:2): [True: 196k, False: 683k]
  ------------------
  452|   196k|		return exp > 0
  ------------------
  |  Branch (452:10): [True: 98.5k, False: 97.5k]
  ------------------
  453|   196k|			? sign * (float) (1 << exp) * (1.0 + prec / 1024.0)
  454|   196k|			: sign / (float) (1 << -exp) * (1.0 + prec / 1024.0);
  455|   879k|	}
  456|   879k|}
tiff2vips.c:rtiff_parse_palette:
 1579|    205|{
 1580|    205|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1581|    205|	int bits_per_sample = rtiff->header.bits_per_sample;
 1582|       |
 1583|    205|	int len;
 1584|    205|	PaletteRead *read;
 1585|    205|	int i;
 1586|       |
 1587|    205|	if (rtiff_check_bits_palette(rtiff) ||
  ------------------
  |  Branch (1587:6): [True: 0, False: 205]
  ------------------
 1588|    205|		rtiff_check_min_samples(rtiff, 1))
  ------------------
  |  Branch (1588:3): [True: 0, False: 205]
  ------------------
 1589|      0|		return -1;
 1590|    205|	len = 1 << bits_per_sample;
 1591|       |
 1592|    205|	if (!(read = VIPS_NEW(out, PaletteRead)) ||
  ------------------
  |  |   70|    205|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    205|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    205|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    205|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    205|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1592:6): [True: 0, False: 205]
  ------------------
 1593|    205|		!(read->red8 = VIPS_ARRAY(out, len, VipsPel)) ||
  ------------------
  |  |   72|    205|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    205|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    205|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    205|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    205|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1593:3): [True: 0, False: 205]
  ------------------
 1594|    205|		!(read->green8 = VIPS_ARRAY(out, len, VipsPel)) ||
  ------------------
  |  |   72|    205|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    205|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    205|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    205|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    205|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1594:3): [True: 0, False: 205]
  ------------------
 1595|    205|		!(read->blue8 = VIPS_ARRAY(out, len, VipsPel)))
  ------------------
  |  |   72|    205|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    205|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    205|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    205|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    205|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1595:3): [True: 0, False: 205]
  ------------------
 1596|      0|		return -1;
 1597|       |
 1598|       |	/* Get maps, convert to 8-bit data.
 1599|       |	 */
 1600|    205|	if (!TIFFGetField(rtiff->tiff,
  ------------------
  |  Branch (1600:6): [True: 0, False: 205]
  ------------------
 1601|    205|			TIFFTAG_COLORMAP,
  ------------------
  |  |  309|    205|#define TIFFTAG_COLORMAP 320               /* RGB map for palette image */
  ------------------
 1602|    205|			&read->red16, &read->green16, &read->blue16)) {
 1603|      0|		vips_error("tiff2vips", "%s", _("bad colormap"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1604|      0|		return -1;
 1605|      0|	}
 1606|       |
 1607|       |	/* Old-style colourmaps were 8-bit. If all the top bytes are zero,
 1608|       |	 * assume we have one of these.
 1609|       |	 *
 1610|       |	 * See: https://github.com/libvips/libvips/issues/220
 1611|       |	 */
 1612|    409|	for (i = 0; i < len; i++)
  ------------------
  |  Branch (1612:14): [True: 401, False: 8]
  ------------------
 1613|    401|		if ((read->red16[i] >> 8) |
  ------------------
  |  Branch (1613:7): [True: 197, False: 204]
  ------------------
 1614|    401|			(read->green16[i] >> 8) |
 1615|    401|			(read->blue16[i] >> 8))
 1616|    197|			break;
 1617|    205|	if (i < len)
  ------------------
  |  Branch (1617:6): [True: 197, False: 8]
  ------------------
 1618|    985|		for (i = 0; i < len; i++) {
  ------------------
  |  Branch (1618:15): [True: 788, False: 197]
  ------------------
 1619|    788|			read->red8[i] = read->red16[i] >> 8;
 1620|    788|			read->green8[i] = read->green16[i] >> 8;
 1621|    788|			read->blue8[i] = read->blue16[i] >> 8;
 1622|    788|		}
 1623|      8|	else {
 1624|      8|		g_warning("%s", _("assuming 8-bit palette"));
  ------------------
  |  |  338|      8|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      8|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      8|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      8|                               __VA_ARGS__)
  ------------------
 1625|       |
 1626|     40|		for (i = 0; i < len; i++) {
  ------------------
  |  Branch (1626:15): [True: 32, False: 8]
  ------------------
 1627|     32|			read->red8[i] = read->red16[i] & 0xff;
 1628|     32|			read->green8[i] = read->green16[i] & 0xff;
 1629|     32|			read->blue8[i] = read->blue16[i] & 0xff;
 1630|     32|		}
 1631|      8|	}
 1632|       |
 1633|       |	/* Are all the maps equal? We have a mono image.
 1634|       |	 */
 1635|    205|	read->mono = TRUE;
  ------------------
  |  |  209|    205|#define TRUE    1
  ------------------
 1636|    421|	for (i = 0; i < len; i++)
  ------------------
  |  Branch (1636:14): [True: 411, False: 10]
  ------------------
 1637|    411|		if (read->red16[i] != read->green16[i] ||
  ------------------
  |  Branch (1637:7): [True: 192, False: 219]
  ------------------
 1638|    411|			read->green16[i] != read->blue16[i]) {
  ------------------
  |  Branch (1638:4): [True: 3, False: 216]
  ------------------
 1639|    195|			read->mono = FALSE;
  ------------------
  |  |  206|    195|#define FALSE   0               /* values of boolean */
  ------------------
 1640|    195|			break;
 1641|    195|		}
 1642|       |
 1643|       |	/* There's a TIFF extension, INDEXED, that is the preferred way to
 1644|       |	 * encode mono palette images, but few applications support it. So we
 1645|       |	 * just search the colormap.
 1646|       |	 */
 1647|       |
 1648|    205|	if (bits_per_sample <= 8)
  ------------------
  |  Branch (1648:6): [True: 205, False: 0]
  ------------------
 1649|    205|		out->BandFmt = VIPS_FORMAT_UCHAR;
 1650|      0|	else
 1651|      0|		out->BandFmt = VIPS_FORMAT_USHORT;
 1652|    205|	out->Coding = VIPS_CODING_NONE;
 1653|       |
 1654|    205|	if (read->mono) {
  ------------------
  |  Branch (1654:6): [True: 10, False: 195]
  ------------------
 1655|     10|		out->Bands = samples_per_pixel;
 1656|     10|		if (bits_per_sample <= 8)
  ------------------
  |  Branch (1656:7): [True: 10, False: 0]
  ------------------
 1657|     10|			out->Type = VIPS_INTERPRETATION_B_W;
 1658|      0|		else
 1659|      0|			out->Type = VIPS_INTERPRETATION_GREY16;
 1660|     10|	}
 1661|    195|	else {
 1662|    195|		out->Bands = samples_per_pixel + 2;
 1663|    195|		if (bits_per_sample <= 8)
  ------------------
  |  Branch (1663:7): [True: 195, False: 0]
  ------------------
 1664|    195|			out->Type = VIPS_INTERPRETATION_sRGB;
 1665|      0|		else
 1666|      0|			out->Type = VIPS_INTERPRETATION_RGB16;
 1667|    195|	}
 1668|       |
 1669|    205|	rtiff->client = read;
 1670|    205|	if (bits_per_sample < 8)
  ------------------
  |  Branch (1670:6): [True: 205, False: 0]
  ------------------
 1671|    205|		rtiff->sfn = rtiff_palette_line_bit;
 1672|      0|	else if (bits_per_sample == 8)
  ------------------
  |  Branch (1672:11): [True: 0, False: 0]
  ------------------
 1673|      0|		rtiff->sfn = rtiff_palette_line8;
 1674|      0|	else if (bits_per_sample == 16)
  ------------------
  |  Branch (1674:11): [True: 0, False: 0]
  ------------------
 1675|      0|		rtiff->sfn = rtiff_palette_line16;
 1676|      0|	else
 1677|      0|		g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1678|       |
 1679|    205|	return 0;
 1680|    205|}
tiff2vips.c:rtiff_check_bits_palette:
  929|    205|{
  930|    205|	if (rtiff->header.bits_per_sample != 16 &&
  ------------------
  |  Branch (930:6): [True: 205, False: 0]
  ------------------
  931|    205|		rtiff->header.bits_per_sample != 8 &&
  ------------------
  |  Branch (931:3): [True: 205, False: 0]
  ------------------
  932|    205|		rtiff->header.bits_per_sample != 4 &&
  ------------------
  |  Branch (932:3): [True: 205, False: 0]
  ------------------
  933|    205|		rtiff->header.bits_per_sample != 2 &&
  ------------------
  |  Branch (933:3): [True: 0, False: 205]
  ------------------
  934|    205|		rtiff->header.bits_per_sample != 1) {
  ------------------
  |  Branch (934:3): [True: 0, False: 0]
  ------------------
  935|      0|		vips_error("tiff2vips",
  936|      0|			_("%d bits per sample palette image not supported"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  937|      0|			rtiff->header.bits_per_sample);
  938|      0|		return -1;
  939|      0|	}
  940|       |
  941|    205|	return 0;
  942|    205|}
tiff2vips.c:rtiff_palette_line_bit:
 1466|  2.30k|{
 1467|  2.30k|	PaletteRead *read = (PaletteRead *) client;
 1468|  2.30k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1469|  2.30k|	int bits_per_sample = rtiff->header.bits_per_sample;
 1470|       |
 1471|  2.30k|	int bit;
 1472|  2.30k|	VipsPel data;
 1473|  2.30k|	int x;
 1474|       |
 1475|  2.30k|	bit = 0;
 1476|  2.30k|	data = 0;
 1477|  73.7k|	for (x = 0; x < n * samples_per_pixel; x++) {
  ------------------
  |  Branch (1477:14): [True: 71.4k, False: 2.30k]
  ------------------
 1478|  71.4k|		int i;
 1479|       |
 1480|  71.4k|		if (bit <= 0) {
  ------------------
  |  Branch (1480:7): [True: 17.8k, False: 53.5k]
  ------------------
 1481|  17.8k|			data = *p++;
 1482|  17.8k|			bit = 8;
 1483|  17.8k|		}
 1484|       |
 1485|  71.4k|		i = data >> (8 - bits_per_sample);
 1486|  71.4k|		data <<= bits_per_sample;
 1487|  71.4k|		bit -= bits_per_sample;
 1488|       |
 1489|       |		/* The first band goes through the LUT, subsequent bands are
 1490|       |		 * left-justified and copied.
 1491|       |		 */
 1492|  71.4k|		if (x % samples_per_pixel == 0) {
  ------------------
  |  Branch (1492:7): [True: 71.4k, False: 0]
  ------------------
 1493|  71.4k|			if (read->mono)
  ------------------
  |  Branch (1493:8): [True: 1.05k, False: 70.3k]
  ------------------
 1494|  1.05k|				*q++ = read->red8[i];
 1495|  70.3k|			else {
 1496|  70.3k|				q[0] = read->red8[i];
 1497|  70.3k|				q[1] = read->green8[i];
 1498|  70.3k|				q[2] = read->blue8[i];
 1499|  70.3k|				q += 3;
 1500|  70.3k|			}
 1501|  71.4k|		}
 1502|      0|		else
 1503|      0|			*q++ = VIPS_LSHIFT_INT(i, 8 - bits_per_sample);
  ------------------
  |  |   87|      0|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
 1504|  71.4k|	}
 1505|  2.30k|}
tiff2vips.c:rtiff_parse_copy:
 1719|  1.65k|{
 1720|  1.65k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1721|  1.65k|	int photometric_interpretation =
 1722|  1.65k|		rtiff->header.photometric_interpretation;
 1723|  1.65k|	int bits_per_sample = rtiff->header.bits_per_sample;
 1724|  1.65k|	int sample_format = rtiff->header.sample_format;
 1725|  1.65k|	int inkset = rtiff->header.inkset;
 1726|       |
 1727|  1.65k|	if (rtiff_non_fractional(rtiff))
  ------------------
  |  Branch (1727:6): [True: 136, False: 1.51k]
  ------------------
 1728|    136|		return -1;
 1729|       |
 1730|  1.51k|	out->Bands = samples_per_pixel;
 1731|  1.51k|	out->BandFmt = rtiff_guess_format(rtiff);
 1732|  1.51k|	if (out->BandFmt == VIPS_FORMAT_NOTSET)
  ------------------
  |  Branch (1732:6): [True: 1, False: 1.51k]
  ------------------
 1733|      1|		return -1;
 1734|  1.51k|	out->Coding = VIPS_CODING_NONE;
 1735|       |
 1736|  1.51k|	if (samples_per_pixel >= 3 &&
  ------------------
  |  Branch (1736:6): [True: 1.10k, False: 414]
  ------------------
 1737|  1.51k|		(photometric_interpretation == PHOTOMETRIC_RGB ||
  ------------------
  |  |  223|  2.20k|#define PHOTOMETRIC_RGB 2                  /* RGB color model */
  ------------------
  |  Branch (1737:4): [True: 241, False: 863]
  ------------------
 1738|  1.10k|		photometric_interpretation == PHOTOMETRIC_YCBCR)) {
  ------------------
  |  |  227|    863|#define PHOTOMETRIC_YCBCR 6                /* !CCIR 601 */
  ------------------
  |  Branch (1738:3): [True: 289, False: 574]
  ------------------
 1739|    530|		if (out->BandFmt == VIPS_FORMAT_USHORT)
  ------------------
  |  Branch (1739:7): [True: 202, False: 328]
  ------------------
 1740|    202|			out->Type = VIPS_INTERPRETATION_RGB16;
 1741|    328|		else if (!vips_band_format_isint(out->BandFmt))
  ------------------
  |  Branch (1741:12): [True: 69, False: 259]
  ------------------
 1742|       |			/* Most float images use 0 - 1 for black - white.
 1743|       |			 * Photoshop uses 0 - 1 and no gamma.
 1744|       |			 */
 1745|     69|			out->Type = VIPS_INTERPRETATION_scRGB;
 1746|    259|		else
 1747|    259|			out->Type = VIPS_INTERPRETATION_sRGB;
 1748|    530|	}
 1749|    988|	else if (samples_per_pixel >= 3 &&
  ------------------
  |  Branch (1749:11): [True: 574, False: 414]
  ------------------
 1750|    988|		photometric_interpretation == PHOTOMETRIC_CIELAB)
  ------------------
  |  |  228|    574|#define PHOTOMETRIC_CIELAB 8               /* !1976 CIE L*a*b* */
  ------------------
  |  Branch (1750:3): [True: 5, False: 569]
  ------------------
 1751|      5|		out->Type = VIPS_INTERPRETATION_LAB;
 1752|    983|	else if (photometric_interpretation == PHOTOMETRIC_SEPARATED &&
  ------------------
  |  |  226|  1.96k|#define PHOTOMETRIC_SEPARATED 5            /* !color separations */
  ------------------
  |  Branch (1752:11): [True: 53, False: 930]
  ------------------
 1753|    983|		samples_per_pixel >= 4 &&
  ------------------
  |  Branch (1753:3): [True: 49, False: 4]
  ------------------
 1754|    983|		inkset == INKSET_CMYK)
  ------------------
  |  |  323|     49|#define INKSET_CMYK 1                      /* !cyan-magenta-yellow-black color */
  ------------------
  |  Branch (1754:3): [True: 49, False: 0]
  ------------------
 1755|     49|		out->Type = VIPS_INTERPRETATION_CMYK;
 1756|    934|	else
 1757|    934|		out->Type = VIPS_INTERPRETATION_MULTIBAND;
 1758|       |
 1759|  1.51k|	rtiff->client = out;
 1760|       |
 1761|  1.51k|	if (bits_per_sample == 16 && sample_format == SAMPLEFORMAT_IEEEFP) {
  ------------------
  |  |  336|    482|#define SAMPLEFORMAT_IEEEFP 3              /* !IEEE floating point data */
  ------------------
  |  Branch (1761:6): [True: 482, False: 1.03k]
  |  Branch (1761:31): [True: 93, False: 389]
  ------------------
 1762|     93|		rtiff->sfn = rtiff_memcpy_f16_line;
 1763|     93|	}
 1764|  1.42k|	else {
 1765|  1.42k|		rtiff->sfn = rtiff_memcpy_line;
 1766|       |
 1767|       |		/* We expand YCBCR images to RGB using JPEGCOLORMODE_RGB, and this
 1768|       |		 * means we need a slightly larger read buffer for the edge pixels. In
 1769|       |		 * turn, this means we can't just memcpy to libvips regions.
 1770|       |		 */
 1771|  1.42k|		rtiff->memcpy = photometric_interpretation != PHOTOMETRIC_YCBCR;
  ------------------
  |  |  227|  1.42k|#define PHOTOMETRIC_YCBCR 6                /* !CCIR 601 */
  ------------------
 1772|  1.42k|	}
 1773|       |
 1774|  1.51k|	return 0;
 1775|  1.51k|}
tiff2vips.c:rtiff_memcpy_f16_line:
 1697|  3.22k|{
 1698|  3.22k|	VipsImage *im = (VipsImage *) client;
 1699|  3.22k|	size_t len = n * im->Bands;
 1700|       |
 1701|  3.22k|	if (im->BandFmt == VIPS_FORMAT_COMPLEX ||
  ------------------
  |  Branch (1701:6): [True: 0, False: 3.22k]
  ------------------
 1702|  3.22k|		im->BandFmt == VIPS_FORMAT_DPCOMPLEX)
  ------------------
  |  Branch (1702:3): [True: 0, False: 3.22k]
  ------------------
 1703|      0|		len *= 2;
 1704|       |
 1705|  3.22k|	int i;
 1706|       |
 1707|  3.22k|	gushort *restrict hp = (gushort *) p;
 1708|  3.22k|	float *restrict fq = (float *) q;
 1709|       |
 1710|   782k|	for (i = 0; i < len; i++)
  ------------------
  |  Branch (1710:14): [True: 778k, False: 3.22k]
  ------------------
 1711|   778k|		fq[i] = half_2_float(hp[i]);
 1712|  3.22k|}
tiff2vips.c:get_resolution:
  509|  7.67k|{
  510|  7.67k|	float x, y;
  511|  7.67k|	int ru;
  512|       |
  513|  7.67k|	if (TIFFGetFieldDefaulted(tiff, TIFFTAG_XRESOLUTION, &x) &&
  ------------------
  |  |  262|  7.67k|#define TIFFTAG_XRESOLUTION 282            /* pixels/resolution in x */
  ------------------
  |  Branch (513:6): [True: 1.11k, False: 6.55k]
  ------------------
  514|  7.67k|		TIFFGetFieldDefaulted(tiff, TIFFTAG_YRESOLUTION, &y) &&
  ------------------
  |  |  263|  1.11k|#define TIFFTAG_YRESOLUTION 283            /* pixels/resolution in y */
  ------------------
  |  Branch (514:3): [True: 1.11k, False: 0]
  ------------------
  515|  7.67k|		tfget16(tiff, TIFFTAG_RESOLUTIONUNIT, &ru)) {
  ------------------
  |  |  287|  1.11k|#define TIFFTAG_RESOLUTIONUNIT 296         /* units of resolutions */
  ------------------
  |  Branch (515:3): [True: 1.11k, False: 0]
  ------------------
  516|  1.11k|		switch (ru) {
  517|    680|		case RESUNIT_NONE:
  ------------------
  |  |  288|    680|#define RESUNIT_NONE 1                     /* no meaningful units */
  ------------------
  |  Branch (517:3): [True: 680, False: 438]
  ------------------
  518|    680|			break;
  519|       |
  520|    434|		case RESUNIT_INCH:
  ------------------
  |  |  289|    434|#define RESUNIT_INCH 2                     /* english */
  ------------------
  |  Branch (520:3): [True: 434, False: 684]
  ------------------
  521|       |			/* In pixels-per-inch ... convert to mm.
  522|       |			 */
  523|    434|			x /= 10.0 * 2.54;
  524|    434|			y /= 10.0 * 2.54;
  525|    434|			vips_image_set_string(out,
  526|    434|				VIPS_META_RESOLUTION_UNIT, "in");
  ------------------
  |  |   93|    434|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  527|    434|			break;
  528|       |
  529|      4|		case RESUNIT_CENTIMETER:
  ------------------
  |  |  290|      4|#define RESUNIT_CENTIMETER 3               /* metric */
  ------------------
  |  Branch (529:3): [True: 4, False: 1.11k]
  ------------------
  530|       |			/* In pixels-per-centimetre ... convert to mm.
  531|       |			 */
  532|      4|			x /= 10.0;
  533|      4|			y /= 10.0;
  534|      4|			vips_image_set_string(out,
  535|      4|				VIPS_META_RESOLUTION_UNIT, "cm");
  ------------------
  |  |   93|      4|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  536|      4|			break;
  537|       |
  538|      0|		default:
  ------------------
  |  Branch (538:3): [True: 0, False: 1.11k]
  ------------------
  539|      0|			vips_error("tiff2vips",
  540|      0|				"%s", _("unknown resolution unit"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  541|      0|			return -1;
  542|  1.11k|		}
  543|  1.11k|	}
  544|  6.55k|	else {
  545|       |		/* We used to warn about missing res data, but it happens so
  546|       |		 * often and is so harmless, why bother.
  547|       |		 */
  548|  6.55k|		x = 1.0;
  549|  6.55k|		y = 1.0;
  550|  6.55k|	}
  551|       |
  552|  7.67k|	out->Xres = x;
  553|  7.67k|	out->Yres = y;
  554|       |
  555|  7.67k|	return 0;
  556|  7.67k|}
tiff2vips.c:rtiff_read_tilewise:
 2594|    823|{
 2595|    823|	int tile_width = rtiff->header.tile_width;
 2596|    823|	int tile_height = rtiff->header.tile_height;
 2597|    823|	VipsImage **t = (VipsImage **) vips_object_local_array(VIPS_OBJECT(out), 4);
  ------------------
  |  |  433|    823|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    823|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    823|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2598|       |
 2599|    823|	VipsImage *in;
 2600|       |
 2601|       |#ifdef DEBUG
 2602|       |	printf("tiff2vips: rtiff_read_tilewise\n");
 2603|       |#endif /*DEBUG*/
 2604|       |
 2605|       |	/* I don't have a sample images for tiled + separate, ban it for now.
 2606|       |	 */
 2607|    823|	if (rtiff->header.separate) {
  ------------------
  |  Branch (2607:6): [True: 5, False: 818]
  ------------------
 2608|      5|		vips_error("tiff2vips", "%s", _("tiled separate planes not supported"));
  ------------------
  |  |   30|      5|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      5|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2609|      5|		return -1;
 2610|      5|	}
 2611|       |
 2612|       |	/* Read to this image, then cache to out, see below.
 2613|       |	 */
 2614|    818|	t[0] = vips_image_new();
 2615|       |
 2616|    818|	if (rtiff_set_header(rtiff, t[0]))
  ------------------
  |  Branch (2616:6): [True: 0, False: 818]
  ------------------
 2617|      0|		return -1;
 2618|       |
 2619|       |	/* Double check: in memcpy mode, the vips tilesize should exactly
 2620|       |	 * match the tifftile size.
 2621|       |	 */
 2622|    818|	if (rtiff->memcpy) {
  ------------------
  |  Branch (2622:6): [True: 129, False: 689]
  ------------------
 2623|    129|		size_t vips_tile_size = VIPS_IMAGE_SIZEOF_PEL(t[0]) *
  ------------------
  |  |  384|    129|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|    129|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
 2624|    129|			tile_width * tile_height;
 2625|       |
 2626|    129|		if (rtiff->header.tile_size != vips_tile_size) {
  ------------------
  |  Branch (2626:7): [True: 0, False: 129]
  ------------------
 2627|      0|			vips_error("tiff2vips", "%s", _("unsupported tiff image type"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2628|      0|			return -1;
 2629|      0|		}
 2630|    129|	}
 2631|       |
 2632|       |	/* Generate to out, adding a cache. Enough tiles for two complete rows.
 2633|       |	 * Set "threaded", so we allow many tiles to be read at once. We lock
 2634|       |	 * around each tile read.
 2635|       |	 */
 2636|    818|	if (
 2637|    818|		vips_image_generate(t[0],
  ------------------
  |  Branch (2637:3): [True: 0, False: 818]
  ------------------
 2638|    818|			rtiff_seq_start, rtiff_fill_region, rtiff_seq_stop,
 2639|    818|			rtiff, NULL) ||
 2640|    818|		vips_tilecache(t[0], &t[1],
  ------------------
  |  Branch (2640:3): [True: 0, False: 818]
  ------------------
 2641|    818|			"tile_width", tile_width,
 2642|    818|			"tile_height", tile_height,
 2643|    818|			"max_tiles", 2 * (1 + t[0]->Xsize / tile_width),
 2644|    818|			"threaded", TRUE,
  ------------------
  |  |  209|    818|#define TRUE    1
  ------------------
 2645|    818|			NULL) ||
 2646|    818|		rtiff_unpremultiply(rtiff, t[1], &t[2]))
  ------------------
  |  Branch (2646:3): [True: 0, False: 818]
  ------------------
 2647|      0|		return -1;
 2648|    818|	in = t[2];
 2649|       |
 2650|       |	/* Only do this if we have to.
 2651|       |	 */
 2652|    818|	if (rtiff->autorotate &&
  ------------------
  |  Branch (2652:6): [True: 0, False: 818]
  ------------------
 2653|    818|		vips_image_get_orientation(in) != 1) {
  ------------------
  |  Branch (2653:3): [True: 0, False: 0]
  ------------------
 2654|      0|		if (vips_autorot(in, &t[3], NULL))
  ------------------
  |  Branch (2654:7): [True: 0, False: 0]
  ------------------
 2655|      0|			return -1;
 2656|      0|		in = t[3];
 2657|      0|	}
 2658|       |
 2659|    818|	if (vips_image_write(in, out))
  ------------------
  |  Branch (2659:6): [True: 0, False: 818]
  ------------------
 2660|      0|		return -1;
 2661|       |
 2662|    818|	return 0;
 2663|    818|}
tiff2vips.c:rtiff_seq_start:
 1957|    818|{
 1958|    818|	Rtiff *rtiff = (Rtiff *) a;
 1959|    818|	RtiffSeq *seq;
 1960|       |
 1961|    818|	if (!(seq = VIPS_NEW(out, RtiffSeq)))
  ------------------
  |  |   70|    818|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    818|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    818|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    818|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    818|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1961:6): [True: 0, False: 818]
  ------------------
 1962|      0|		return NULL;
 1963|    818|	seq->rtiff = rtiff;
 1964|    818|	if (!(seq->buf = vips_malloc(NULL, rtiff->header.tile_size)))
  ------------------
  |  Branch (1964:6): [True: 0, False: 818]
  ------------------
 1965|      0|		return NULL;
 1966|       |
 1967|       |	/* If we will be decompressing, we need a buffer large enough to hold
 1968|       |	 * the largest compressed tile in any page.
 1969|       |	 *
 1970|       |	 * Allocate a buffer 2x the uncompressed tile size ... much simpler
 1971|       |	 * than searching every page for the largest tile with
 1972|       |	 * TIFFTAG_TILEBYTECOUNTS.
 1973|       |	 */
 1974|    818|	if (rtiff->header.we_decompress) {
  ------------------
  |  Branch (1974:6): [True: 55, False: 763]
  ------------------
 1975|     55|		seq->compressed_buf_length = 2 * rtiff->header.tile_size;
 1976|     55|		if (!(seq->compressed_buf = VIPS_MALLOC(NULL,
  ------------------
  |  |   68|     55|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  ------------------
  |  |  |  |  433|     55|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|     55|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|     55|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1976:7): [True: 0, False: 55]
  ------------------
 1977|     55|				  seq->compressed_buf_length)))
 1978|      0|			return NULL;
 1979|     55|	}
 1980|       |
 1981|    818|	return (void *) seq;
 1982|    818|}
tiff2vips.c:rtiff_fill_region:
 2503|  20.4k|{
 2504|  20.4k|	Rtiff *rtiff = (Rtiff *) a;
 2505|  20.4k|	int tile_width = rtiff->header.tile_width;
 2506|  20.4k|	int tile_height = rtiff->header.tile_height;
 2507|  20.4k|	int page_width = rtiff->header.width;
 2508|  20.4k|	int page_height = rtiff->header.height;
 2509|  20.4k|	VipsRect *r = &out->valid;
 2510|  20.4k|	int page_no = r->top / page_height;
 2511|  20.4k|	int page_y = r->top % page_height;
 2512|       |
 2513|  20.4k|	VipsGenerateFn generate;
 2514|       |
 2515|       |#ifdef DEBUG_VERBOSE
 2516|       |	printf("rtiff_fill_region: left = %d, top = %d, "
 2517|       |		   "width = %d, height = %d\n",
 2518|       |		r->left, r->top, r->width, r->height);
 2519|       |#endif /*DEBUG_VERBOSE*/
 2520|       |
 2521|       |	/* Special case: we are filling a single cache tile exactly sized to
 2522|       |	 * match the tiff tile, and we have no repacking to do for this format.
 2523|       |	 *
 2524|       |	 * If we are not on the first page, pages must be a multiple of the
 2525|       |	 * tile size of we'll miss alignment.
 2526|       |	 */
 2527|  20.4k|	if ((page_no == 0 || page_height % tile_height == 0) &&
  ------------------
  |  Branch (2527:7): [True: 20.4k, False: 0]
  |  Branch (2527:23): [True: 0, False: 0]
  ------------------
 2528|  20.4k|		r->left % tile_width == 0 &&
  ------------------
  |  Branch (2528:3): [True: 20.4k, False: 0]
  ------------------
 2529|  20.4k|		r->top % tile_height == 0 &&
  ------------------
  |  Branch (2529:3): [True: 20.4k, False: 0]
  ------------------
 2530|  20.4k|		r->width == tile_width &&
  ------------------
  |  Branch (2530:3): [True: 16.5k, False: 3.94k]
  ------------------
 2531|  20.4k|		r->height == tile_height &&
  ------------------
  |  Branch (2531:3): [True: 13.7k, False: 2.74k]
  ------------------
 2532|  20.4k|		r->left + tile_width <= page_width &&
  ------------------
  |  Branch (2532:3): [True: 13.7k, False: 0]
  ------------------
 2533|  20.4k|		page_y + tile_height <= page_height &&
  ------------------
  |  Branch (2533:3): [True: 13.7k, False: 0]
  ------------------
 2534|  20.4k|		VIPS_REGION_LSKIP(out) == VIPS_REGION_SIZEOF_LINE(out) &&
  ------------------
  |  |  195|  13.7k|	((size_t) ((R)->bpl))
  ------------------
              		VIPS_REGION_LSKIP(out) == VIPS_REGION_SIZEOF_LINE(out) &&
  ------------------
  |  |  203|  34.2k|	((size_t) ((R)->valid.width * VIPS_REGION_SIZEOF_PEL(R)))
  |  |  ------------------
  |  |  |  |  201|  13.7k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  13.7k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  13.7k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2534:3): [True: 13.7k, False: 0]
  ------------------
 2535|  20.4k|		rtiff->memcpy)
  ------------------
  |  Branch (2535:3): [True: 760, False: 13.0k]
  ------------------
 2536|    760|		generate = rtiff_fill_region_aligned;
 2537|  19.7k|	else
 2538|  19.7k|		generate = rtiff_fill_region_unaligned;
 2539|       |
 2540|  20.4k|	VIPS_GATE_START("rtiff_fill_region: work");
  ------------------
  |  |   41|  20.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  20.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  20.4k|	{ \
  |  |   43|  20.4k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 20.4k]
  |  |  ------------------
  |  |   44|  20.4k|			vips__thread_gate_start(NAME); \
  |  |   45|  20.4k|	} \
  |  |   46|  20.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  20.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2541|       |
 2542|  20.4k|	if (generate(out, vseq, a, b, stop)) {
  ------------------
  |  Branch (2542:6): [True: 55, False: 20.4k]
  ------------------
 2543|     55|		VIPS_GATE_STOP("rtiff_fill_region: work");
  ------------------
  |  |   49|     55|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     55|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|     55|	{ \
  |  |   51|     55|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 55]
  |  |  ------------------
  |  |   52|     55|			vips__thread_gate_stop(NAME); \
  |  |   53|     55|	} \
  |  |   54|     55|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     55|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2544|     55|		return -1;
 2545|     55|	}
 2546|       |
 2547|  20.4k|	VIPS_GATE_STOP("rtiff_fill_region: work");
  ------------------
  |  |   49|  20.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  20.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  20.4k|	{ \
  |  |   51|  20.4k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 20.4k]
  |  |  ------------------
  |  |   52|  20.4k|			vips__thread_gate_stop(NAME); \
  |  |   53|  20.4k|	} \
  |  |   54|  20.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  20.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2548|       |
 2549|  20.4k|	return 0;
 2550|  20.4k|}
tiff2vips.c:rtiff_fill_region_aligned:
 2367|    760|{
 2368|    760|	RtiffSeq *seq = (RtiffSeq *) vseq;
 2369|    760|	Rtiff *rtiff = (Rtiff *) a;
 2370|    760|	VipsRect *r = &out->valid;
 2371|    760|	int page_height = rtiff->header.height;
 2372|    760|	int page_no = r->top / page_height;
 2373|    760|	int page_y = r->top % page_height;
 2374|       |
 2375|    760|	g_assert((r->left % rtiff->header.tile_width) == 0);
  ------------------
  |  |  166|    760|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    760|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    760|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2376|    760|	g_assert((r->top % rtiff->header.tile_height) == 0);
  ------------------
  |  |  166|    760|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    760|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    760|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2377|    760|	g_assert(r->width == rtiff->header.tile_width);
  ------------------
  |  |  166|    760|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    760|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    760|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2378|    760|	g_assert(r->height == rtiff->header.tile_height);
  ------------------
  |  |  166|    760|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    760|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    760|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2379|    760|	g_assert(VIPS_REGION_LSKIP(out) == VIPS_REGION_SIZEOF_LINE(out));
  ------------------
  |  |  166|    760|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    760|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    760|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2380|       |
 2381|       |#ifdef DEBUG_VERBOSE
 2382|       |	printf("rtiff_fill_region_aligned:\n");
 2383|       |#endif /*DEBUG_VERBOSE*/
 2384|       |
 2385|       |	/* Read that tile directly into the vips tile.
 2386|       |	 */
 2387|    760|	if (rtiff_read_tile(seq,
  ------------------
  |  Branch (2387:6): [True: 1, False: 759]
  ------------------
 2388|    760|			(tdata_t *) VIPS_REGION_ADDR(out, r->left, r->top),
  ------------------
  |  |  227|    760|	((R)->data + \
  |  |  228|    760|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|    760|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|    760|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|    760|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|    760|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|    760|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2389|    760|			rtiff->page + page_no, r->left, page_y))
 2390|      1|		return -1;
 2391|       |
 2392|    759|	return 0;
 2393|    760|}
tiff2vips.c:rtiff_read_tile:
 2292|  20.4k|{
 2293|  20.4k|	Rtiff *rtiff = seq->rtiff;
 2294|       |
 2295|  20.4k|	tsize_t size;
 2296|       |
 2297|       |#ifdef DEBUG_VERBOSE
 2298|       |	printf("rtiff_read_tile: page = %d, x = %d, y = %d, "
 2299|       |		   "we_decompress = %d\n",
 2300|       |		page, x, y, rtiff->header.we_decompress);
 2301|       |#endif /*DEBUG_VERBOSE*/
 2302|       |
 2303|       |	/* Compressed tiles load to compressed_buf.
 2304|       |	 */
 2305|  20.4k|	if (rtiff->header.we_decompress) {
  ------------------
  |  Branch (2305:6): [True: 55, False: 20.4k]
  ------------------
 2306|     55|		ttile_t tile_no;
 2307|       |
 2308|     55|		g_rec_mutex_lock(&rtiff->lock);
 2309|       |
 2310|     55|		if (rtiff_set_page(rtiff, page)) {
  ------------------
  |  Branch (2310:7): [True: 0, False: 55]
  ------------------
 2311|      0|			g_rec_mutex_unlock(&rtiff->lock);
 2312|      0|			return -1;
 2313|      0|		}
 2314|       |
 2315|     55|		tile_no = TIFFComputeTile(rtiff->tiff, x, y, 0, 0);
 2316|       |
 2317|     55|		size = TIFFReadRawTile(rtiff->tiff, tile_no,
 2318|     55|			seq->compressed_buf, seq->compressed_buf_length);
 2319|     55|		if (size <= 0) {
  ------------------
  |  Branch (2319:7): [True: 21, False: 34]
  ------------------
 2320|     21|			vips_foreign_load_invalidate(rtiff->out);
 2321|     21|			g_rec_mutex_unlock(&rtiff->lock);
 2322|     21|			return -1;
 2323|     21|		}
 2324|       |
 2325|     34|		g_rec_mutex_unlock(&rtiff->lock);
 2326|       |
 2327|       |		/* Decompress outside the lock, so we get parallelism.
 2328|       |		 */
 2329|     34|		if (rtiff_decompress_tile(rtiff, seq->compressed_buf, size, buf)) {
  ------------------
  |  Branch (2329:7): [True: 34, False: 0]
  ------------------
 2330|     34|			vips_error("tiff2vips", _("decompress error tile %d x %d"), x, y);
  ------------------
  |  |   30|     34|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     34|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2331|     34|			return -1;
 2332|     34|		}
 2333|     34|	}
 2334|  20.4k|	else {
 2335|  20.4k|		g_rec_mutex_lock(&rtiff->lock);
 2336|       |
 2337|  20.4k|		if (rtiff_set_page(rtiff, page)) {
  ------------------
  |  Branch (2337:7): [True: 0, False: 20.4k]
  ------------------
 2338|      0|			g_rec_mutex_unlock(&rtiff->lock);
 2339|      0|			return -1;
 2340|      0|		}
 2341|       |
 2342|  20.4k|		int result;
 2343|  20.4k|		if (rtiff->header.read_as_rgba)
  ------------------
  |  Branch (2343:7): [True: 1.27k, False: 19.1k]
  ------------------
 2344|  1.27k|			result = rtiff_read_rgba_tile(rtiff, x, y, buf);
 2345|  19.1k|		else
 2346|  19.1k|			result = TIFFReadTile(rtiff->tiff, buf, x, y, 0, 0) < 0;
 2347|  20.4k|		if (result && rtiff->fail_on >= VIPS_FAIL_ON_WARNING) {
  ------------------
  |  Branch (2347:7): [True: 7.24k, False: 13.1k]
  |  Branch (2347:17): [True: 0, False: 7.24k]
  ------------------
 2348|      0|			vips_foreign_load_invalidate(rtiff->out);
 2349|      0|			g_rec_mutex_unlock(&rtiff->lock);
 2350|      0|			return -1;
 2351|      0|		}
 2352|       |
 2353|  20.4k|		g_rec_mutex_unlock(&rtiff->lock);
 2354|  20.4k|	}
 2355|       |
 2356|  20.4k|	return 0;
 2357|  20.4k|}
tiff2vips.c:rtiff_decompress_tile:
 2226|     34|{
 2227|     34|	g_assert(rtiff->header.we_decompress);
  ------------------
  |  |  166|     34|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|     34|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     34|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2228|       |
 2229|     34|	switch (rtiff->header.compression) {
 2230|      0|	case JP2K_YCC:
  ------------------
  |  |  277|      0|#define JP2K_YCC 33003
  ------------------
  |  Branch (2230:2): [True: 0, False: 34]
  ------------------
 2231|      0|	case JP2K_RGB:
  ------------------
  |  |  278|      0|#define JP2K_RGB 33005
  ------------------
  |  Branch (2231:2): [True: 0, False: 34]
  ------------------
 2232|      0|	case JP2K_LOSSY:
  ------------------
  |  |  282|      0|#define JP2K_LOSSY 33004
  ------------------
  |  Branch (2232:2): [True: 0, False: 34]
  ------------------
 2233|      0|		if (vips__foreign_load_jp2k_decompress(
  ------------------
  |  Branch (2233:7): [True: 0, False: 0]
  ------------------
 2234|      0|				rtiff->out,
 2235|      0|				rtiff->header.tile_width,
 2236|      0|				rtiff->header.tile_height,
 2237|      0|				TRUE,
  ------------------
  |  |  209|      0|#define TRUE    1
  ------------------
 2238|      0|				in, size,
 2239|      0|				out, rtiff->header.tile_size))
 2240|      0|			return -1;
 2241|      0|		break;
 2242|       |
 2243|      0|#ifdef HAVE_JPEG
 2244|     34|	case COMPRESSION_JPEG:
  ------------------
  |  |  190|     34|#define COMPRESSION_JPEG 7            /* %JPEG DCT compression */
  ------------------
  |  Branch (2244:2): [True: 34, False: 0]
  ------------------
 2245|     34|		if (rtiff_decompress_jpeg(rtiff, in, size, out))
  ------------------
  |  Branch (2245:7): [True: 34, False: 0]
  ------------------
 2246|     34|			return -1;
 2247|      0|		break;
 2248|      0|#endif /*HAVE_JPEG*/
 2249|       |
 2250|      0|	default:
  ------------------
  |  Branch (2250:2): [True: 0, False: 34]
  ------------------
 2251|      0|		g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2252|      0|		break;
 2253|     34|	}
 2254|       |
 2255|      0|	return 0;
 2256|     34|}
tiff2vips.c:rtiff_decompress_jpeg:
 2187|     34|{
 2188|     34|	struct jpeg_decompress_struct cinfo = { 0 };
 2189|     34|	ErrorManager eman;
 2190|       |
 2191|     34|	if (setjmp(eman.jmp) == 0) {
  ------------------
  |  Branch (2191:6): [True: 34, False: 0]
  ------------------
 2192|     34|		cinfo.err = jpeg_std_error(&eman.pub);
 2193|     34|		cinfo.err->addon_message_table = vips__jpeg_message_table;
 2194|     34|		cinfo.err->first_addon_message = 1000;
 2195|     34|		cinfo.err->last_addon_message = 1001;
 2196|     34|		eman.pub.error_exit = vips__new_error_exit;
 2197|     34|		eman.pub.emit_message = rtiff_decompress_jpeg_emit_message;
 2198|     34|		eman.pub.output_message = vips__new_output_message;
 2199|     34|		eman.fp = NULL;
 2200|       |
 2201|     34|		jpeg_create_decompress(&cinfo);
  ------------------
  |  |  972|     34|  jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
  |  |  ------------------
  |  |  |  |    4|     34|#define JPEG_LIB_VERSION  62
  |  |  ------------------
  |  |  973|     34|                        (size_t)sizeof(struct jpeg_decompress_struct))
  ------------------
 2202|       |
 2203|     34|		if (rtiff_decompress_jpeg_run(rtiff, &cinfo,
  ------------------
  |  Branch (2203:7): [True: 0, False: 34]
  ------------------
 2204|     34|				data, data_len, out)) {
 2205|      0|			jpeg_destroy_decompress(&cinfo);
 2206|      0|			return -1;
 2207|      0|		}
 2208|     34|	}
 2209|      0|	else {
 2210|       |#ifdef DEBUG_VERBOSE
 2211|       |		printf("rtiff_decompress_jpeg: error return\n");
 2212|       |#endif /*DEBUG_VERBOSE*/
 2213|       |
 2214|      0|		jpeg_destroy_decompress(&cinfo);
 2215|      0|		return -1;
 2216|      0|	}
 2217|       |
 2218|     34|	jpeg_destroy_decompress(&cinfo);
 2219|       |
 2220|     34|	return 0;
 2221|     34|}
tiff2vips.c:rtiff_decompress_jpeg_emit_message:
 2162|  28.0k|{
 2163|  28.0k|	if (msg_level < 0) {
  ------------------
  |  Branch (2163:6): [True: 26.1k, False: 1.87k]
  ------------------
 2164|  26.1k|		long num_warnings;
 2165|       |
 2166|       |		/* Always count warnings in num_warnings.
 2167|       |		 */
 2168|  26.1k|		num_warnings = ++cinfo->err->num_warnings;
 2169|       |
 2170|       |		/* Corrupt files may give many warnings, the policy here is to
 2171|       |		 * show only the first warning and treat many warnings as fatal,
 2172|       |		 * unless unlimited is set.
 2173|       |		 */
 2174|  26.1k|		if (num_warnings == 1)
  ------------------
  |  Branch (2174:7): [True: 27, False: 26.1k]
  ------------------
 2175|     27|			(*cinfo->err->output_message)(cinfo);
 2176|  26.1k|	}
 2177|  1.87k|	else if (cinfo->err->trace_level >= msg_level)
  ------------------
  |  Branch (2177:11): [True: 0, False: 1.87k]
  ------------------
 2178|       |		/* It's a trace message. Show it if trace_level >= msg_level.
 2179|       |		 */
 2180|      0|		(*cinfo->err->output_message)(cinfo);
 2181|  28.0k|}
tiff2vips.c:rtiff_decompress_jpeg_run:
 2071|     34|{
 2072|     34|	void *tables;
 2073|     34|	uint32_t tables_len;
 2074|     34|	int bytes_per_pixel;
 2075|     34|	size_t bytes_per_scanline;
 2076|     34|	VipsPel *q;
 2077|     34|	int y;
 2078|       |
 2079|       |#ifdef DEBUG_VERBOSE
 2080|       |	printf("rtiff_decompress_jpeg_run: decompressing %zd bytes of jpg\n",
 2081|       |		data_len);
 2082|       |#endif /*DEBUG_VERBOSE*/
 2083|       |
 2084|       |	/* Tables are optional.
 2085|       |	 */
 2086|     34|	tables = NULL;
 2087|     34|	tables_len = 0;
 2088|     34|	(void) TIFFGetField(rtiff->tiff,
 2089|     34|		TIFFTAG_JPEGTABLES, &tables_len, &tables);
  ------------------
  |  |  346|     34|#define TIFFTAG_JPEGTABLES 347             /* %JPEG table stream */
  ------------------
 2090|       |
 2091|     34|	if (tables) {
  ------------------
  |  Branch (2091:6): [True: 0, False: 34]
  ------------------
 2092|      0|		rtiff_decompress_jpeg_set_memory(cinfo, tables, tables_len);
 2093|      0|		if (jpeg_read_header(cinfo, FALSE) !=
  ------------------
  |  |  206|      0|#define FALSE   0               /* values of boolean */
  ------------------
  |  Branch (2093:7): [True: 0, False: 0]
  ------------------
 2094|      0|			JPEG_HEADER_TABLES_ONLY)
  ------------------
  |  | 1067|      0|#define JPEG_HEADER_TABLES_ONLY  2 /* Found valid table-specs-only datastream */
  ------------------
 2095|      0|			return -1;
 2096|      0|	}
 2097|       |
 2098|     34|	rtiff_decompress_jpeg_set_memory(cinfo, data, data_len);
 2099|       |
 2100|     34|	if (jpeg_read_header(cinfo, TRUE) != JPEG_HEADER_OK)
  ------------------
  |  |  209|     34|#define TRUE    1
  ------------------
              	if (jpeg_read_header(cinfo, TRUE) != JPEG_HEADER_OK)
  ------------------
  |  | 1066|     34|#define JPEG_HEADER_OK           1 /* Found valid image datastream */
  ------------------
  |  Branch (2100:6): [True: 0, False: 34]
  ------------------
 2101|      0|		return -1;
 2102|       |
 2103|       |	/* This isn't stored in the tile -- we have to set it from the
 2104|       |	 * enclosing TIFF.
 2105|       |	 */
 2106|     34|	switch (rtiff->header.photometric_interpretation) {
 2107|      0|	case PHOTOMETRIC_SEPARATED:
  ------------------
  |  |  226|      0|#define PHOTOMETRIC_SEPARATED 5            /* !color separations */
  ------------------
  |  Branch (2107:2): [True: 0, False: 34]
  ------------------
 2108|      0|		cinfo->jpeg_color_space = JCS_CMYK;
 2109|      0|		bytes_per_pixel = 4;
 2110|      0|		break;
 2111|       |
 2112|      0|	case PHOTOMETRIC_YCBCR:
  ------------------
  |  |  227|      0|#define PHOTOMETRIC_YCBCR 6                /* !CCIR 601 */
  ------------------
  |  Branch (2112:2): [True: 0, False: 34]
  ------------------
 2113|      0|		cinfo->jpeg_color_space = JCS_YCbCr;
 2114|      0|		bytes_per_pixel = 3;
 2115|      0|		break;
 2116|       |
 2117|      0|	case PHOTOMETRIC_RGB:
  ------------------
  |  |  223|      0|#define PHOTOMETRIC_RGB 2                  /* RGB color model */
  ------------------
  |  Branch (2117:2): [True: 0, False: 34]
  ------------------
 2118|      0|	case PHOTOMETRIC_CIELAB:
  ------------------
  |  |  228|      0|#define PHOTOMETRIC_CIELAB 8               /* !1976 CIE L*a*b* */
  ------------------
  |  Branch (2118:2): [True: 0, False: 34]
  ------------------
 2119|       |		// RGB-compressed CIELAB is a possibility, amazingly
 2120|      0|		cinfo->jpeg_color_space = JCS_RGB;
 2121|      0|		bytes_per_pixel = 3;
 2122|      0|		break;
 2123|       |
 2124|      0|	case PHOTOMETRIC_MINISWHITE:
  ------------------
  |  |  221|      0|#define PHOTOMETRIC_MINISWHITE 0           /* min value is white */
  ------------------
  |  Branch (2124:2): [True: 0, False: 34]
  ------------------
 2125|      0|	case PHOTOMETRIC_MINISBLACK:
  ------------------
  |  |  222|      0|#define PHOTOMETRIC_MINISBLACK 1           /* min value is black */
  ------------------
  |  Branch (2125:2): [True: 0, False: 34]
  ------------------
 2126|      0|		cinfo->jpeg_color_space = JCS_GRAYSCALE;
 2127|      0|		bytes_per_pixel = 1;
 2128|      0|		break;
 2129|       |
 2130|      0|	default:
  ------------------
  |  Branch (2130:2): [True: 0, False: 34]
  ------------------
 2131|      0|		cinfo->jpeg_color_space = JCS_UNKNOWN;
 2132|      0|		bytes_per_pixel = 1;
 2133|      0|		break;
 2134|     34|	}
 2135|       |
 2136|      0|	jpeg_calc_output_dimensions(cinfo);
 2137|      0|	bytes_per_scanline = cinfo->output_width * bytes_per_pixel;
 2138|       |
 2139|       |	/* Double-check tile dimensions.
 2140|       |	 */
 2141|      0|	if (cinfo->output_width > rtiff->header.tile_width ||
  ------------------
  |  Branch (2141:6): [True: 0, False: 0]
  ------------------
 2142|      0|		cinfo->output_height > rtiff->header.tile_height ||
  ------------------
  |  Branch (2142:3): [True: 0, False: 0]
  ------------------
 2143|      0|		bytes_per_scanline > rtiff->header.tile_row_size)
  ------------------
  |  Branch (2143:3): [True: 0, False: 0]
  ------------------
 2144|      0|		return -1;
 2145|       |
 2146|      0|	jpeg_start_decompress(cinfo);
 2147|       |
 2148|      0|	q = (VipsPel *) out;
 2149|      0|	for (y = 0; y < cinfo->output_height; y++) {
  ------------------
  |  Branch (2149:14): [True: 0, False: 0]
  ------------------
 2150|      0|		JSAMPROW row_pointer[1];
 2151|       |
 2152|      0|		row_pointer[0] = (JSAMPLE *) q;
 2153|      0|		jpeg_read_scanlines(cinfo, &row_pointer[0], 1);
 2154|      0|		q += bytes_per_scanline;
 2155|      0|	}
 2156|       |
 2157|      0|	return 0;
 2158|      0|}
tiff2vips.c:rtiff_decompress_jpeg_set_memory:
 2050|     34|{
 2051|     34|	if (!cinfo->src)
  ------------------
  |  Branch (2051:6): [True: 34, False: 0]
  ------------------
 2052|     34|		cinfo->src =
 2053|     34|			(struct jpeg_source_mgr *) (*cinfo->mem->alloc_small)(
 2054|     34|				(j_common_ptr) cinfo,
 2055|     34|				JPOOL_PERMANENT,
  ------------------
  |  |  888|     34|#define JPOOL_PERMANENT  0      /* lasts until master record is destroyed */
  ------------------
 2056|     34|				sizeof(struct jpeg_source_mgr));
 2057|       |
 2058|       |	/* Present the whole of data as one chunk.
 2059|       |	 */
 2060|     34|	cinfo->src->bytes_in_buffer = data_len;
 2061|     34|	cinfo->src->next_input_byte = (JOCTET *) data;
 2062|     34|	cinfo->src->init_source = rtiff_decompress_jpeg_init_source;
 2063|     34|	cinfo->src->fill_input_buffer = rtiff_decompress_jpeg_fill_input_buffer;
 2064|     34|	cinfo->src->skip_input_data = rtiff_decompress_jpeg_skip_input_data;
 2065|     34|	cinfo->src->resync_to_restart = jpeg_resync_to_restart;
 2066|     34|}
tiff2vips.c:rtiff_decompress_jpeg_init_source:
 1987|     34|{
 1988|       |	/* Nothing.
 1989|       |	 */
 1990|     34|}
tiff2vips.c:rtiff_decompress_jpeg_fill_input_buffer:
 1994|  24.3k|{
 1995|  24.3k|	static const JOCTET mybuffer[4] = {
 1996|  24.3k|		(JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0
  ------------------
  |  | 1167|  24.3k|#define JPEG_EOI        0xD9    /* EOI marker code */
  ------------------
 1997|  24.3k|	};
 1998|       |
 1999|       |	/* The whole JPEG data is expected to reside in the supplied memory
 2000|       |	 * buffer, so any request for more data beyond the given buffer size
 2001|       |	 * is treated as an error.
 2002|       |	 */
 2003|  24.3k|	WARNMS(cinfo, JWRN_VIPS_IMAGE_EOF);
  ------------------
  |  |  283|  24.3k|  ((cinfo)->err->msg_code = (code), \
  |  |  284|  24.3k|   (*(cinfo)->err->emit_message) ((j_common_ptr)(cinfo), -1))
  ------------------
 2004|       |
 2005|       |	/* Insert a fake EOI marker
 2006|       |	 */
 2007|  24.3k|	cinfo->src->next_input_byte = mybuffer;
 2008|  24.3k|	cinfo->src->bytes_in_buffer = 2;
 2009|       |
 2010|  24.3k|	return TRUE;
  ------------------
  |  |  209|  24.3k|#define TRUE    1
  ------------------
 2011|  24.3k|}
tiff2vips.c:rtiff_decompress_jpeg_skip_input_data:
 2026|    494|{
 2027|    494|	struct jpeg_source_mgr *src = cinfo->src;
 2028|       |
 2029|       |	/* Just a dumb implementation for now.  Could use fseek() except
 2030|       |	 * it doesn't work on pipes.  Not clear that being smart is worth
 2031|       |	 * any trouble anyway --- large skips are infrequent.
 2032|       |	 */
 2033|    494|	if (num_bytes > 0) {
  ------------------
  |  Branch (2033:6): [True: 494, False: 0]
  ------------------
 2034|  24.7k|		while (num_bytes > (long) src->bytes_in_buffer) {
  ------------------
  |  Branch (2034:10): [True: 24.2k, False: 494]
  ------------------
 2035|  24.2k|			num_bytes -= (long) src->bytes_in_buffer;
 2036|  24.2k|			(void) (*src->fill_input_buffer)(cinfo);
 2037|       |			/* note we assume that fill_input_buffer will never
 2038|       |			 * return FALSE, so suspension need not be handled.
 2039|       |			 */
 2040|  24.2k|		}
 2041|       |
 2042|    494|		src->next_input_byte += (size_t) num_bytes;
 2043|    494|		src->bytes_in_buffer -= (size_t) num_bytes;
 2044|    494|	}
 2045|    494|}
tiff2vips.c:rtiff_read_rgba_tile:
 2262|  1.27k|{
 2263|  1.27k|	guint32 *u32_buf = (guint32 *) buf;
 2264|       |
 2265|  1.27k|	if (!TIFFReadRGBATile(rtiff->tiff, x, y, u32_buf))
  ------------------
  |  Branch (2265:6): [True: 957, False: 313]
  ------------------
 2266|    957|		return -1;
 2267|       |
 2268|       |	/* For some reason TIFFReadRGBATile decodes tiles upside down,
 2269|       |	 * so we need to flip them.
 2270|       |	 */
 2271|    313|	guint32 tile_width = rtiff->header.tile_width;
 2272|    313|	guint32 tile_height = rtiff->header.tile_height;
 2273|       |
 2274|    313|	guint32 *up = u32_buf;
 2275|    313|	guint32 *down = u32_buf + (tile_height - 1) * tile_width;
 2276|  4.35k|	for (int yy = 0; yy < tile_height / 2; yy++) {
  ------------------
  |  Branch (2276:19): [True: 4.04k, False: 313]
  ------------------
 2277|   138k|		for (int xx = 0; xx < tile_width; xx++)
  ------------------
  |  Branch (2277:20): [True: 134k, False: 4.04k]
  ------------------
 2278|   134k|			VIPS_SWAP(guint32, up[xx], down[xx]);
  ------------------
  |  |  114|   134k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   134k|#define G_STMT_START  do
  |  |  ------------------
  |  |  115|   134k|	{ \
  |  |  116|   134k|		TYPE t = (A); \
  |  |  117|   134k|		(A) = (B); \
  |  |  118|   134k|		(B) = t; \
  |  |  119|   134k|	} \
  |  |  120|   134k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   134k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2279|       |
 2280|  4.04k|		up += tile_width;
 2281|  4.04k|		down -= tile_width;
 2282|  4.04k|	}
 2283|       |
 2284|    313|	return 0;
 2285|  1.27k|}
tiff2vips.c:rtiff_fill_region_unaligned:
 2400|  19.7k|{
 2401|  19.7k|	RtiffSeq *seq = (RtiffSeq *) vseq;
 2402|  19.7k|	Rtiff *rtiff = (Rtiff *) a;
 2403|  19.7k|	int tile_width = rtiff->header.tile_width;
 2404|  19.7k|	int tile_height = rtiff->header.tile_height;
 2405|  19.7k|	int page_height = rtiff->header.height;
 2406|  19.7k|	int tile_row_size = rtiff->header.tile_row_size;
 2407|  19.7k|	VipsRect *r = &out->valid;
 2408|       |
 2409|  19.7k|	int x, y, z;
 2410|       |
 2411|       |#ifdef DEBUG_VERBOSE
 2412|       |	printf("rtiff_fill_region_unaligned:\n");
 2413|       |#endif /*DEBUG_VERBOSE*/
 2414|       |
 2415|  19.7k|	y = 0;
 2416|  39.3k|	while (y < r->height) {
  ------------------
  |  Branch (2416:9): [True: 19.7k, False: 19.6k]
  ------------------
 2417|  19.7k|		VipsRect tile, page, hit;
 2418|       |
 2419|       |		/* Not necessary, but it stops static analyzers complaining
 2420|       |		 * about a used-before-set.
 2421|       |		 */
 2422|  19.7k|		hit.height = 0;
 2423|       |
 2424|  19.7k|		x = 0;
 2425|  39.3k|		while (x < r->width) {
  ------------------
  |  Branch (2425:10): [True: 19.7k, False: 19.6k]
  ------------------
 2426|       |			/* page_no is within this toilet roll image, not tiff
 2427|       |			 * file page number ... add the number of the start
 2428|       |			 * page to get that.
 2429|       |			 */
 2430|  19.7k|			int page_no = (r->top + y) / page_height;
 2431|  19.7k|			int page_y = (r->top + y) % page_height;
 2432|       |
 2433|       |			/* Coordinate of the tile on this page that xy falls in.
 2434|       |			 */
 2435|  19.7k|			int xs = ((r->left + x) / tile_width) * tile_width;
 2436|  19.7k|			int ys = (page_y / tile_height) * tile_height;
 2437|       |
 2438|  19.7k|			if (rtiff_read_tile(seq,
  ------------------
  |  Branch (2438:8): [True: 54, False: 19.6k]
  ------------------
 2439|  19.7k|					seq->buf, rtiff->page + page_no, xs, ys))
 2440|     54|				return -1;
 2441|       |
 2442|       |			/* Position of tile on the page.
 2443|       |			 */
 2444|  19.6k|			tile.left = xs;
 2445|  19.6k|			tile.top = ys;
 2446|  19.6k|			tile.width = tile_width;
 2447|  19.6k|			tile.height = tile_height;
 2448|       |
 2449|       |			/* It'll be clipped by this page.
 2450|       |			 */
 2451|  19.6k|			page.left = 0;
 2452|  19.6k|			page.top = 0;
 2453|  19.6k|			page.width = rtiff->header.width;
 2454|  19.6k|			page.height = rtiff->header.height;
 2455|  19.6k|			vips_rect_intersectrect(&tile, &page, &tile);
 2456|       |
 2457|       |			/* To image coordinates.
 2458|       |			 */
 2459|  19.6k|			tile.top += page_no * page_height;
 2460|       |
 2461|       |			/* And clip again by this region.
 2462|       |			 */
 2463|  19.6k|			vips_rect_intersectrect(&tile, r, &hit);
 2464|       |
 2465|       |			/* We are inside a tilecache, so requests will always
 2466|       |			 * be aligned left-right to tile boundaries.
 2467|       |			 *
 2468|       |			 * this is not true vertically for toilet-roll images.
 2469|       |			 */
 2470|  19.6k|			g_assert(hit.left == tile.left);
  ------------------
  |  |  166|  19.6k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  19.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2471|       |
 2472|       |			/* Unpack to VIPS format.
 2473|       |			 * Just unpack the section of the tile we need.
 2474|       |			 */
 2475|   324k|			for (z = 0; z < hit.height; z++) {
  ------------------
  |  Branch (2475:16): [True: 304k, False: 19.6k]
  ------------------
 2476|   304k|				VipsPel *p = (VipsPel *) seq->buf +
 2477|   304k|					(hit.top - tile.top + z) *
 2478|   304k|						tile_row_size;
 2479|   304k|				VipsPel *q = VIPS_REGION_ADDR(out,
  ------------------
  |  |  227|   304k|	((R)->data + \
  |  |  228|   304k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   304k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   304k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   304k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   304k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   304k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2480|   304k|					hit.left, hit.top + z);
 2481|       |
 2482|   304k|				rtiff->sfn(rtiff,
 2483|   304k|					q, p, hit.width, rtiff->client);
 2484|   304k|			}
 2485|       |
 2486|  19.6k|			x += hit.width;
 2487|  19.6k|		}
 2488|       |
 2489|       |		/* This will be the same for all tiles in the row we've just
 2490|       |		 * done.
 2491|       |		 */
 2492|  19.6k|		y += hit.height;
 2493|  19.6k|	}
 2494|       |
 2495|  19.6k|	return 0;
 2496|  19.7k|}
tiff2vips.c:rtiff_seq_stop:
 2554|    818|{
 2555|    818|	RtiffSeq *seq = (RtiffSeq *) vseq;
 2556|       |
 2557|    818|	VIPS_FREE(seq->buf);
  ------------------
  |  |   50|    818|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|    818|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    818|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    818|	{ \
  |  |  |  |   43|    818|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 818, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|    818|			(void) F((S)); \
  |  |  |  |   45|    818|			(S) = 0; \
  |  |  |  |   46|    818|		} \
  |  |  |  |   47|    818|	} \
  |  |  |  |   48|    818|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    818|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2558|    818|	VIPS_FREE(seq->compressed_buf);
  ------------------
  |  |   50|    818|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|    818|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    818|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    818|	{ \
  |  |  |  |   43|    818|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 55, False: 763]
  |  |  |  |  ------------------
  |  |  |  |   44|     55|			(void) F((S)); \
  |  |  |  |   45|     55|			(S) = 0; \
  |  |  |  |   46|     55|		} \
  |  |  |  |   47|    818|	} \
  |  |  |  |   48|    818|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    818|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2559|       |
 2560|    818|	return 0;
 2561|    818|}
tiff2vips.c:rtiff_unpremultiply:
 2567|  3.73k|{
 2568|  3.73k|	if (rtiff->header.alpha_band != -1) {
  ------------------
  |  Branch (2568:6): [True: 607, False: 3.12k]
  ------------------
 2569|    607|		VipsImage *x;
 2570|       |
 2571|    607|		if (
 2572|    607|			vips_unpremultiply(in, &x,
  ------------------
  |  Branch (2572:4): [True: 0, False: 607]
  ------------------
 2573|    607|				"alpha_band", rtiff->header.alpha_band,
 2574|    607|				NULL) ||
 2575|    607|			vips_cast(x, out, in->BandFmt, NULL)) {
  ------------------
  |  Branch (2575:4): [True: 0, False: 607]
  ------------------
 2576|      0|			g_object_unref(x);
 2577|      0|			return -1;
 2578|      0|		}
 2579|    607|		g_object_unref(x);
 2580|    607|	}
 2581|  3.12k|	else {
 2582|  3.12k|		*out = in;
 2583|  3.12k|		g_object_ref(in);
 2584|  3.12k|	}
 2585|       |
 2586|  3.73k|	return 0;
 2587|  3.73k|}
tiff2vips.c:rtiff_read_stripwise:
 2876|  2.91k|{
 2877|  2.91k|	VipsImage **t = (VipsImage **)
 2878|  2.91k|		vips_object_local_array(VIPS_OBJECT(out), 4);
  ------------------
  |  |  433|  2.91k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  2.91k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.91k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2879|       |
 2880|  2.91k|	VipsImage *in;
 2881|  2.91k|	int tile_height;
 2882|       |
 2883|       |#ifdef DEBUG
 2884|       |	printf("tiff2vips: rtiff_read_stripwise\n");
 2885|       |#endif /*DEBUG*/
 2886|       |
 2887|  2.91k|	t[0] = vips_image_new();
 2888|  2.91k|	if (rtiff_set_header(rtiff, t[0]))
  ------------------
  |  Branch (2888:6): [True: 0, False: 2.91k]
  ------------------
 2889|      0|		return -1;
 2890|       |
 2891|       |	/* Double check: in memcpy mode, the vips linesize should exactly
 2892|       |	 * match the tiff line size.
 2893|       |	 */
 2894|  2.91k|	if (rtiff->memcpy) {
  ------------------
  |  Branch (2894:6): [True: 1.72k, False: 1.18k]
  ------------------
 2895|  1.72k|		size_t vips_line_size;
 2896|       |
 2897|       |		/* Lines are smaller in plane-separated mode.
 2898|       |		 */
 2899|  1.72k|		if (rtiff->header.separate)
  ------------------
  |  Branch (2899:7): [True: 20, False: 1.70k]
  ------------------
 2900|     20|			vips_line_size = VIPS_IMAGE_SIZEOF_ELEMENT(t[0]) *
  ------------------
  |  |  382|     20|	(vips_format_sizeof_unsafe((I)->BandFmt))
  ------------------
 2901|     20|				t[0]->Xsize;
 2902|  1.70k|		else
 2903|  1.70k|			vips_line_size = VIPS_IMAGE_SIZEOF_LINE(t[0]);
  ------------------
  |  |  386|  1.70k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|  1.70k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  1.70k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2904|       |
 2905|  1.72k|		if (rtiff->header.bits_per_sample == 16 &&
  ------------------
  |  Branch (2905:7): [True: 110, False: 1.61k]
  ------------------
 2906|  1.72k|			rtiff->header.sample_format == SAMPLEFORMAT_IEEEFP)
  ------------------
  |  |  336|    110|#define SAMPLEFORMAT_IEEEFP 3              /* !IEEE floating point data */
  ------------------
  |  Branch (2906:4): [True: 0, False: 110]
  ------------------
 2907|      0|			vips_line_size /= 2;
 2908|       |
 2909|  1.72k|		if (vips_line_size != rtiff->header.scanline_size) {
  ------------------
  |  Branch (2909:7): [True: 0, False: 1.72k]
  ------------------
 2910|      0|			vips_error("tiff2vips", "%s", _("unsupported tiff image type"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2911|      0|			return -1;
 2912|      0|		}
 2913|  1.72k|	}
 2914|       |
 2915|       |	/* If we have separate image planes, we must read to a plane buffer,
 2916|       |	 * then interleave to the output.
 2917|       |	 *
 2918|       |	 * We don't need a separate buffer per thread since the _generate()
 2919|       |	 * function runs inside the cache lock.
 2920|       |	 */
 2921|  2.91k|	if (rtiff->header.separate) {
  ------------------
  |  Branch (2921:6): [True: 83, False: 2.83k]
  ------------------
 2922|     83|		if (!(rtiff->plane_buf = VIPS_MALLOC(out,
  ------------------
  |  |   68|     83|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  ------------------
  |  |  |  |  433|     83|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|     83|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|     83|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2922:7): [True: 0, False: 83]
  ------------------
 2923|     83|				  rtiff->header.read_size)))
 2924|      0|			return -1;
 2925|     83|	}
 2926|       |
 2927|       |	/* If we need to manipulate pixels, we must read to an interleaved
 2928|       |	 * plane buffer before repacking to the output.
 2929|       |	 *
 2930|       |	 * If we are doing a multi-page read, we need a strip buffer, since
 2931|       |	 * strips may not be aligned on tile boundaries.
 2932|       |	 *
 2933|       |	 * We don't need a separate buffer per thread since the _generate()
 2934|       |	 * function runs inside the cache lock.
 2935|       |	 */
 2936|  2.91k|	if (!rtiff->memcpy ||
  ------------------
  |  Branch (2936:6): [True: 1.18k, False: 1.72k]
  ------------------
 2937|  2.91k|		rtiff->n > 1) {
  ------------------
  |  Branch (2937:3): [True: 0, False: 1.72k]
  ------------------
 2938|  1.18k|		tsize_t size;
 2939|       |
 2940|  1.18k|		size = rtiff->header.read_size;
 2941|  1.18k|		if (rtiff->header.separate)
  ------------------
  |  Branch (2941:7): [True: 63, False: 1.12k]
  ------------------
 2942|     63|			size *= rtiff->header.samples_per_pixel;
 2943|       |
 2944|  1.18k|		if (!(rtiff->contig_buf = VIPS_MALLOC(out, size)))
  ------------------
  |  |   68|  1.18k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  ------------------
  |  |  |  |  433|  1.18k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  1.18k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  1.18k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2944:7): [True: 0, False: 1.18k]
  ------------------
 2945|      0|			return -1;
 2946|  1.18k|	}
 2947|       |
 2948|       |	/* rows_per_strip can be very large if this is a separate plane image,
 2949|       |	 * beware.
 2950|       |	 *
 2951|       |	 * Some images have very small rowsperstrip which will cause a lot of
 2952|       |	 * work for the tilecache -- set a min size for tiles which is a
 2953|       |	 * multiple of rowsperstrip.
 2954|       |	 */
 2955|  2.91k|	tile_height = VIPS_MAX(
  ------------------
  |  |   54|  2.91k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 1.21k, False: 1.70k]
  |  |  ------------------
  ------------------
 2956|  2.91k|		VIPS_ROUND_DOWN(16, rtiff->header.read_height),
 2957|  2.91k|		rtiff->header.read_height);
 2958|       |
 2959|  2.91k|	if (
 2960|  2.91k|		vips_image_generate(t[0],
  ------------------
  |  Branch (2960:3): [True: 0, False: 2.91k]
  ------------------
 2961|  2.91k|			NULL, rtiff_stripwise_generate, NULL,
 2962|  2.91k|			rtiff, NULL) ||
 2963|  2.91k|		vips_sequential(t[0], &t[1],
  ------------------
  |  Branch (2963:3): [True: 0, False: 2.91k]
  ------------------
 2964|  2.91k|			"tile_height", tile_height,
 2965|  2.91k|			NULL) ||
 2966|  2.91k|		rtiff_unpremultiply(rtiff, t[1], &t[2]))
  ------------------
  |  Branch (2966:3): [True: 0, False: 2.91k]
  ------------------
 2967|      0|		return -1;
 2968|  2.91k|	in = t[2];
 2969|       |
 2970|       |	/* Only do this if we have to.
 2971|       |	 */
 2972|  2.91k|	if (rtiff->autorotate &&
  ------------------
  |  Branch (2972:6): [True: 0, False: 2.91k]
  ------------------
 2973|  2.91k|		vips_image_get_orientation(in) != 1) {
  ------------------
  |  Branch (2973:3): [True: 0, False: 0]
  ------------------
 2974|      0|		if (vips_autorot(in, &t[3], NULL))
  ------------------
  |  Branch (2974:7): [True: 0, False: 0]
  ------------------
 2975|      0|			return -1;
 2976|      0|		in = t[3];
 2977|      0|	}
 2978|       |
 2979|  2.91k|	if (vips_image_write(in, out))
  ------------------
  |  Branch (2979:6): [True: 1.10k, False: 1.80k]
  ------------------
 2980|  1.10k|		return -1;
 2981|       |
 2982|  1.80k|	return 0;
 2983|  2.91k|}
tiff2vips.c:rtiff_stripwise_generate:
 2729|  5.16k|{
 2730|  5.16k|	VipsImage *out = out_region->im;
 2731|  5.16k|	Rtiff *rtiff = (Rtiff *) a;
 2732|  5.16k|	int read_height = rtiff->header.read_height;
 2733|  5.16k|	int page_height = rtiff->header.height;
 2734|  5.16k|	tsize_t scanline_size = rtiff->header.scanline_size;
 2735|  5.16k|	VipsRect *r = &out_region->valid;
 2736|       |
 2737|  5.16k|	int y;
 2738|       |
 2739|       |#ifdef DEBUG_VERBOSE
 2740|       |	printf("rtiff_stripwise_generate: top = %d, height = %d\n",
 2741|       |		r->top, r->height);
 2742|       |	printf("rtiff_stripwise_generate: y_top = %d\n", rtiff->y_pos);
 2743|       |#endif /*DEBUG_VERBOSE*/
 2744|       |
 2745|       |	/* We're inside a tilecache where tiles are the full image width, so
 2746|       |	 * this should always be true.
 2747|       |	 */
 2748|  5.16k|	g_assert(r->left == 0);
  ------------------
  |  |  166|  5.16k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.16k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.16k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2749|  5.16k|	g_assert(r->width == out_region->im->Xsize);
  ------------------
  |  |  166|  5.16k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.16k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.16k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2750|  5.16k|	g_assert(VIPS_RECT_BOTTOM(r) <= out_region->im->Ysize);
  ------------------
  |  |  166|  5.16k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.16k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.16k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2751|       |
 2752|       |	/* If we're reading more than one page, tiles won't fall on strip
 2753|       |	 * boundaries. Tiles may be contain several strips.
 2754|       |	 */
 2755|       |
 2756|       |	/* Check that y_pos is correct. It should be, since we are inside
 2757|       |	 * a vips_sequential().
 2758|       |	 */
 2759|  5.16k|	if (r->top != rtiff->y_pos) {
  ------------------
  |  Branch (2759:6): [True: 0, False: 5.16k]
  ------------------
 2760|      0|		vips_error("tiff2vips",
 2761|      0|			_("out of order read -- at line %d, but line %d requested"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2762|      0|			rtiff->y_pos, r->top);
 2763|      0|		return -1;
 2764|      0|	}
 2765|       |
 2766|  5.16k|	VIPS_GATE_START("rtiff_stripwise_generate: work");
  ------------------
  |  |   41|  5.16k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  5.16k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  5.16k|	{ \
  |  |   43|  5.16k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 5.16k]
  |  |  ------------------
  |  |   44|  5.16k|			vips__thread_gate_start(NAME); \
  |  |   45|  5.16k|	} \
  |  |   46|  5.16k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.16k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2767|       |
 2768|  5.16k|	y = 0;
 2769|  36.4k|	while (y < r->height) {
  ------------------
  |  Branch (2769:9): [True: 32.3k, False: 4.05k]
  ------------------
 2770|       |		/* page_no is within this toilet roll image, not tiff
 2771|       |		 * file page number ... add the number of the start
 2772|       |		 * page to get that.
 2773|       |		 */
 2774|  32.3k|		int page_no = (r->top + y) / page_height;
 2775|  32.3k|		int y_page = (r->top + y) % page_height;
 2776|       |
 2777|       |		/* Strip number.
 2778|       |		 */
 2779|  32.3k|		tstrip_t strip_no = y_page / read_height;
 2780|       |
 2781|  32.3k|		VipsRect image, page, strip, hit;
 2782|       |
 2783|       |		/* Our four (including the output region) rects, all in
 2784|       |		 * output image coordinates.
 2785|       |		 */
 2786|  32.3k|		image.left = 0;
 2787|  32.3k|		image.top = 0;
 2788|  32.3k|		image.width = out->Xsize;
 2789|  32.3k|		image.height = out->Ysize;
 2790|       |
 2791|  32.3k|		page.left = 0;
 2792|  32.3k|		page.top = page_height * ((r->top + y) / page_height);
 2793|  32.3k|		page.width = out->Xsize;
 2794|  32.3k|		page.height = page_height;
 2795|       |
 2796|  32.3k|		strip.left = 0;
 2797|  32.3k|		strip.top = page.top + strip_no * read_height;
 2798|  32.3k|		strip.width = out->Xsize;
 2799|  32.3k|		strip.height = read_height;
 2800|       |
 2801|       |		/* Clip strip against page and image ... the final strip will
 2802|       |		 * be smaller.
 2803|       |		 */
 2804|  32.3k|		vips_rect_intersectrect(&strip, &image, &strip);
 2805|  32.3k|		vips_rect_intersectrect(&strip, &page, &strip);
 2806|       |
 2807|       |		/* Now the bit that overlaps with the region we are filling.
 2808|       |		 */
 2809|  32.3k|		vips_rect_intersectrect(&strip, r, &hit);
 2810|       |
 2811|  32.3k|		g_assert(hit.height > 0);
  ------------------
  |  |  166|  32.3k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  32.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  32.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2812|       |
 2813|       |		/* Read directly into the image if we can. Otherwise, we must
 2814|       |		 * read to a temp buffer then unpack into the image.
 2815|       |		 *
 2816|       |		 * We need to read via a buffer if we need to reformat pixels,
 2817|       |		 * or if this strip is not aligned on a tile boundary.
 2818|       |		 */
 2819|  32.3k|		if (rtiff->memcpy &&
  ------------------
  |  Branch (2819:7): [True: 13.7k, False: 18.5k]
  ------------------
 2820|  32.3k|			hit.top == strip.top &&
  ------------------
  |  Branch (2820:4): [True: 13.7k, False: 0]
  ------------------
 2821|  32.3k|			hit.height == strip.height) {
  ------------------
  |  Branch (2821:4): [True: 13.7k, False: 0]
  ------------------
 2822|  13.7k|			if (rtiff_strip_read_interleaved(rtiff,
  ------------------
  |  Branch (2822:8): [True: 1.10k, False: 12.6k]
  ------------------
 2823|  13.7k|					rtiff->page + page_no, strip_no,
 2824|  13.7k|					VIPS_REGION_ADDR(out_region, 0, r->top + y))) {
  ------------------
  |  |  227|  13.7k|	((R)->data + \
  |  |  228|  13.7k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  13.7k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  13.7k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  13.7k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  13.7k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  13.7k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2825|  1.10k|				VIPS_GATE_STOP(
  ------------------
  |  |   49|  1.10k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.10k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  1.10k|	{ \
  |  |   51|  1.10k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 1.10k]
  |  |  ------------------
  |  |   52|  1.10k|			vips__thread_gate_stop(NAME); \
  |  |   53|  1.10k|	} \
  |  |   54|  1.10k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.10k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2826|  1.10k|					"rtiff_stripwise_generate: work");
 2827|  1.10k|				return -1;
 2828|  1.10k|			}
 2829|  13.7k|		}
 2830|  18.5k|		else {
 2831|  18.5k|			VipsPel *p;
 2832|  18.5k|			VipsPel *q;
 2833|  18.5k|			int z;
 2834|       |
 2835|       |			/* Read and interleave the entire strip.
 2836|       |			 */
 2837|  18.5k|			if (rtiff_strip_read_interleaved(rtiff,
  ------------------
  |  Branch (2837:8): [True: 0, False: 18.5k]
  ------------------
 2838|  18.5k|					rtiff->page + page_no, strip_no,
 2839|  18.5k|					rtiff->contig_buf)) {
 2840|      0|				VIPS_GATE_STOP(
  ------------------
  |  |   49|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|      0|	{ \
  |  |   51|      0|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   52|      0|			vips__thread_gate_stop(NAME); \
  |  |   53|      0|	} \
  |  |   54|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2841|      0|					"rtiff_stripwise_generate: work");
 2842|      0|				return -1;
 2843|      0|			}
 2844|       |
 2845|       |			/* Do any repacking to generate pixels in vips layout.
 2846|       |			 */
 2847|  18.5k|			p = (VipsPel *) rtiff->contig_buf +
 2848|  18.5k|				(hit.top - strip.top) * scanline_size;
 2849|  18.5k|			q = VIPS_REGION_ADDR(out_region, 0, r->top + y);
  ------------------
  |  |  227|  18.5k|	((R)->data + \
  |  |  228|  18.5k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  18.5k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  18.5k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  18.5k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  18.5k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  18.5k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2850|  75.1k|			for (z = 0; z < hit.height; z++) {
  ------------------
  |  Branch (2850:16): [True: 56.5k, False: 18.5k]
  ------------------
 2851|  56.5k|				rtiff->sfn(rtiff,
 2852|  56.5k|					q, p, out_region->im->Xsize, rtiff->client);
 2853|       |
 2854|  56.5k|				p += scanline_size;
 2855|  56.5k|				q += VIPS_REGION_LSKIP(out_region);
  ------------------
  |  |  195|  56.5k|	((size_t) ((R)->bpl))
  ------------------
 2856|  56.5k|			}
 2857|  18.5k|		}
 2858|       |
 2859|  31.2k|		y += hit.height;
 2860|  31.2k|		rtiff->y_pos += hit.height;
 2861|  31.2k|	}
 2862|       |
 2863|  5.16k|	VIPS_GATE_STOP("rtiff_stripwise_generate: work");
  ------------------
  |  |   49|  4.05k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.05k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  4.05k|	{ \
  |  |   51|  4.05k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 4.05k]
  |  |  ------------------
  |  |   52|  4.05k|			vips__thread_gate_stop(NAME); \
  |  |   53|  4.05k|	} \
  |  |   54|  5.16k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.16k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2864|       |
 2865|  4.05k|	return 0;
 2866|  5.16k|}
tiff2vips.c:rtiff_strip_read_interleaved:
 2673|  32.3k|{
 2674|  32.3k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 2675|  32.3k|	int read_height = rtiff->header.read_height;
 2676|  32.3k|	int bits_per_sample = rtiff->header.bits_per_sample;
 2677|  32.3k|	int read_as_rgba = rtiff->header.read_as_rgba;
 2678|  32.3k|	int strip_y = strip * read_height;
 2679|       |
 2680|  32.3k|	if (rtiff_set_page(rtiff, page))
  ------------------
  |  Branch (2680:6): [True: 0, False: 32.3k]
  ------------------
 2681|      0|		return -1;
 2682|       |
 2683|  32.3k|	if (read_as_rgba) {
  ------------------
  |  Branch (2683:6): [True: 4.67k, False: 27.6k]
  ------------------
 2684|  4.67k|		if (rtiff_rgba_strip_read(rtiff, strip, buf))
  ------------------
  |  Branch (2684:7): [True: 1.10k, False: 3.56k]
  ------------------
 2685|  1.10k|			return -1;
 2686|  4.67k|	}
 2687|  27.6k|	else if (rtiff->header.separate) {
  ------------------
  |  Branch (2687:11): [True: 219, False: 27.4k]
  ------------------
 2688|    219|		int page_width = rtiff->header.width;
 2689|    219|		int page_height = rtiff->header.height;
 2690|    219|		int strips_per_plane = 1 + (page_height - 1) / read_height;
 2691|    219|		int strip_height = VIPS_MIN(read_height,
  ------------------
  |  |   55|    219|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 136, False: 83]
  |  |  ------------------
  ------------------
 2692|    219|			page_height - strip_y);
 2693|    219|		int pels_per_strip = page_width * strip_height;
 2694|    219|		int bytes_per_sample = bits_per_sample >> 3;
 2695|       |
 2696|    219|		int i, j, k;
 2697|       |
 2698|    872|		for (i = 0; i < samples_per_pixel; i++) {
  ------------------
  |  Branch (2698:15): [True: 653, False: 219]
  ------------------
 2699|    653|			VipsPel *p;
 2700|    653|			VipsPel *q;
 2701|       |
 2702|    653|			if (rtiff_strip_read(rtiff,
  ------------------
  |  Branch (2702:8): [True: 0, False: 653]
  ------------------
 2703|    653|					strips_per_plane * i + strip,
 2704|    653|					rtiff->plane_buf))
 2705|      0|				return -1;
 2706|       |
 2707|    653|			p = (VipsPel *) rtiff->plane_buf;
 2708|    653|			q = i * bytes_per_sample + (VipsPel *) buf;
 2709|  94.4k|			for (j = 0; j < pels_per_strip; j++) {
  ------------------
  |  Branch (2709:16): [True: 93.7k, False: 653]
  ------------------
 2710|   225k|				for (k = 0; k < bytes_per_sample; k++)
  ------------------
  |  Branch (2710:17): [True: 131k, False: 93.7k]
  ------------------
 2711|   131k|					q[k] = p[k];
 2712|       |
 2713|  93.7k|				p += bytes_per_sample;
 2714|  93.7k|				q += bytes_per_sample * samples_per_pixel;
 2715|  93.7k|			}
 2716|    653|		}
 2717|    219|	}
 2718|  27.4k|	else {
 2719|  27.4k|		if (rtiff_strip_read(rtiff, strip, buf))
  ------------------
  |  Branch (2719:7): [True: 0, False: 27.4k]
  ------------------
 2720|      0|			return -1;
 2721|  27.4k|	}
 2722|       |
 2723|  31.2k|	return 0;
 2724|  32.3k|}
tiff2vips.c:rtiff_rgba_strip_read:
  732|  4.67k|{
  733|  4.67k|	RtiffHeader *header = &rtiff->header;
  734|       |
  735|  4.67k|	TIFFRGBAImage img;
  736|  4.67k|	guint32 rows_to_read;
  737|  4.67k|	char err[1024] = "";
  738|       |
  739|       |#ifdef DEBUG_VERBOSE
  740|       |	printf("rtiff_rgba_strip_read: reading strip %d\n", strip);
  741|       |#endif /*DEBUG_VERBOSE*/
  742|       |
  743|  4.67k|	if (!TIFFRGBAImageOK(rtiff->tiff, err) ||
  ------------------
  |  Branch (743:6): [True: 16, False: 4.66k]
  ------------------
  744|  4.67k|		!TIFFRGBAImageBegin(&img, rtiff->tiff, 0, err)) {
  ------------------
  |  Branch (744:3): [True: 42, False: 4.61k]
  ------------------
  745|     58|		vips_foreign_load_invalidate(rtiff->out);
  746|     58|		vips_error("tiff2vips", "%s", err);
  747|     58|		return -1;
  748|     58|	}
  749|       |
  750|  4.61k|	img.req_orientation = header->orientation;
  751|  4.61k|	img.row_offset = strip * header->rows_per_strip;
  752|  4.61k|	img.col_offset = 0;
  753|       |
  754|  4.61k|	rows_to_read =
  755|  4.61k|		VIPS_MIN(header->rows_per_strip, header->height - img.row_offset);
  ------------------
  |  |   55|  4.61k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 3.72k, False: 895]
  |  |  ------------------
  ------------------
  756|       |
  757|  4.61k|	if (!TIFFRGBAImageGet(&img, buf, header->width, rows_to_read)) {
  ------------------
  |  Branch (757:6): [True: 1.05k, False: 3.56k]
  ------------------
  758|  1.05k|		TIFFRGBAImageEnd(&img);
  759|  1.05k|		vips_foreign_load_invalidate(rtiff->out);
  760|  1.05k|		vips_error("tiff2vips", "%s", _("read error"));
  ------------------
  |  |   30|  1.05k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  1.05k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  761|  1.05k|		return -1;
  762|  1.05k|	}
  763|       |
  764|  3.56k|	TIFFRGBAImageEnd(&img);
  765|       |
  766|  3.56k|	if (rtiff->failed) {
  ------------------
  |  Branch (766:6): [True: 0, False: 3.56k]
  ------------------
  767|      0|		vips_foreign_load_invalidate(rtiff->out);
  768|      0|		return -1;
  769|      0|	}
  770|       |
  771|  3.56k|	return 0;
  772|  3.56k|}
tiff2vips.c:rtiff_strip_read:
  704|  28.1k|{
  705|  28.1k|	tsize_t length;
  706|       |
  707|       |#ifdef DEBUG_VERBOSE
  708|       |	printf("rtiff_strip_read: reading strip %d\n", strip);
  709|       |#endif /*DEBUG_VERBOSE*/
  710|       |
  711|  28.1k|	if (rtiff->header.read_scanlinewise)
  ------------------
  |  Branch (711:6): [True: 0, False: 28.1k]
  ------------------
  712|      0|		length = TIFFReadScanline(rtiff->tiff, buf, strip, (tsample_t) 0);
  713|  28.1k|	else
  714|  28.1k|		length = TIFFReadEncodedStrip(rtiff->tiff, strip, buf, (tsize_t) -1);
  715|       |
  716|  28.1k|	if (length == -1 && rtiff->fail_on >= VIPS_FAIL_ON_WARNING) {
  ------------------
  |  Branch (716:6): [True: 12.7k, False: 15.3k]
  |  Branch (716:22): [True: 0, False: 12.7k]
  ------------------
  717|      0|		vips_foreign_load_invalidate(rtiff->out);
  718|      0|		vips_error("tiff2vips", "%s", _("read error"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  719|      0|		return -1;
  720|      0|	}
  721|       |
  722|  28.1k|	if (rtiff->failed) {
  ------------------
  |  Branch (722:6): [True: 0, False: 28.1k]
  ------------------
  723|      0|		vips_foreign_load_invalidate(rtiff->out);
  724|      0|		return -1;
  725|      0|	}
  726|       |
  727|  28.1k|	return 0;
  728|  28.1k|}

tiffload.c:vips_foreign_load_tiff_class_init:
  165|      1|{
  166|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  167|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  168|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  169|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  170|       |
  171|       |	/* Other libraries may be using libtiff, we want to capture tiff
  172|       |	 * warning and error as soon as we can.
  173|       |	 *
  174|       |	 * This class init will be triggered during startup.
  175|       |	 */
  176|      1|	vips__tiff_init();
  177|       |
  178|      1|	gobject_class->dispose = vips_foreign_load_tiff_dispose;
  179|      1|	gobject_class->set_property = vips_object_set_property;
  180|      1|	gobject_class->get_property = vips_object_get_property;
  181|       |
  182|      1|	object_class->nickname = "tiffload_base";
  183|      1|	object_class->description = _("load tiff");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  184|       |
  185|       |	/* We are fast, but must test after openslideload.
  186|       |	 */
  187|      1|	foreign_class->priority = 50;
  188|       |
  189|      1|	load_class->get_flags_filename =
  190|      1|		vips_foreign_load_tiff_get_flags_filename;
  191|      1|	load_class->get_flags = vips_foreign_load_tiff_get_flags;
  192|      1|	load_class->header = vips_foreign_load_tiff_header;
  193|      1|	load_class->load = vips_foreign_load_tiff_load;
  194|       |
  195|      1|	VIPS_ARG_INT(class, "page", 20,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  196|      1|		_("Page"),
  197|      1|		_("First page to load"),
  198|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  199|      1|		G_STRUCT_OFFSET(VipsForeignLoadTiff, page),
  200|      1|		0, 100000, 0);
  201|       |
  202|      1|	VIPS_ARG_INT(class, "n", 21,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  203|      1|		_("n"),
  204|      1|		_("Number of pages to load, -1 for all"),
  205|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  206|      1|		G_STRUCT_OFFSET(VipsForeignLoadTiff, n),
  207|      1|		-1, 100000, 1);
  208|       |
  209|      1|	VIPS_ARG_BOOL(class, "autorotate", 22,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  210|      1|		_("Autorotate"),
  211|      1|		_("Rotate image using orientation tag"),
  212|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  213|      1|		G_STRUCT_OFFSET(VipsForeignLoadTiff, autorotate),
  214|      1|		FALSE);
  215|       |
  216|      1|	VIPS_ARG_INT(class, "subifd", 23,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  217|      1|		_("subifd"),
  218|      1|		_("Subifd index"),
  219|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  220|      1|		G_STRUCT_OFFSET(VipsForeignLoadTiff, subifd),
  221|      1|		-1, 100000, -1);
  222|       |
  223|       |#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
  224|       |	VIPS_ARG_BOOL(class, "unlimited", 24,
  225|       |		_("Unlimited"),
  226|       |		_("Remove all denial of service limits"),
  227|       |		VIPS_ARGUMENT_OPTIONAL_INPUT,
  228|       |		G_STRUCT_OFFSET(VipsForeignLoadTiff, unlimited),
  229|       |		FALSE);
  230|       |#endif
  231|      1|}
tiffload.c:vips_foreign_load_tiff_dispose:
   93|  4.85k|{
   94|  4.85k|	VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) gobject;
   95|       |
   96|  4.85k|	VIPS_UNREF(tiff->source);
  ------------------
  |  |   57|  4.85k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  4.85k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  4.85k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  4.85k|	{ \
  |  |  |  |   43|  4.85k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 4.85k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  4.85k|			(void) F((S)); \
  |  |  |  |   45|  4.85k|			(S) = 0; \
  |  |  |  |   46|  4.85k|		} \
  |  |  |  |   47|  4.85k|	} \
  |  |  |  |   48|  4.85k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  4.85k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   97|       |
   98|  4.85k|	G_OBJECT_CLASS(vips_foreign_load_tiff_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  4.85k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  4.85k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  4.85k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   99|  4.85k|}
tiffload.c:vips_foreign_load_tiff_get_flags_source:
  103|  4.86k|{
  104|  4.86k|	VipsForeignFlags flags;
  105|       |
  106|  4.86k|	flags = 0;
  107|  4.86k|	if (vips__istifftiled_source(source))
  ------------------
  |  Branch (107:6): [True: 1.01k, False: 3.85k]
  ------------------
  108|  1.01k|		flags |= VIPS_FOREIGN_PARTIAL;
  109|  3.85k|	else
  110|  3.85k|		flags |= VIPS_FOREIGN_SEQUENTIAL;
  111|       |
  112|  4.86k|	return flags;
  113|  4.86k|}
tiffload.c:vips_foreign_load_tiff_get_flags:
  131|  4.86k|{
  132|  4.86k|	VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) load;
  133|       |
  134|  4.86k|	return vips_foreign_load_tiff_get_flags_source(tiff->source);
  135|  4.86k|}
tiffload.c:vips_foreign_load_tiff_header:
  139|  4.86k|{
  140|  4.86k|	VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) load;
  141|       |
  142|  4.86k|	if (vips__tiff_read_header_source(tiff->source, load->out,
  ------------------
  |  Branch (142:6): [True: 929, False: 3.93k]
  ------------------
  143|  4.86k|			tiff->page, tiff->n, tiff->autorotate, tiff->subifd,
  144|  4.86k|			load->fail_on, tiff->unlimited))
  145|    929|		return -1;
  146|       |
  147|  3.93k|	return 0;
  148|  4.86k|}
tiffload.c:vips_foreign_load_tiff_load:
  152|  3.74k|{
  153|  3.74k|	VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) load;
  154|       |
  155|  3.74k|	if (vips__tiff_read_source(tiff->source, load->real,
  ------------------
  |  Branch (155:6): [True: 1.11k, False: 2.62k]
  ------------------
  156|  3.74k|			tiff->page, tiff->n, tiff->autorotate, tiff->subifd,
  157|  3.74k|			load->fail_on, tiff->unlimited))
  158|  1.11k|		return -1;
  159|       |
  160|  2.62k|	return 0;
  161|  3.74k|}
tiffload.c:vips_foreign_load_tiff_init:
  235|  4.86k|{
  236|  4.86k|	tiff->page = 0;
  237|  4.86k|	tiff->n = 1;
  238|  4.86k|	tiff->subifd = -1;
  239|  4.86k|	tiff->unlimited = FALSE;
  ------------------
  |  |  794|  4.86k|#define	FALSE	(0)
  ------------------
  240|  4.86k|}
tiffload.c:vips_foreign_load_tiff_source_class_init:
  284|      1|{
  285|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  286|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  287|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  288|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  289|       |
  290|      1|	gobject_class->set_property = vips_object_set_property;
  291|      1|	gobject_class->get_property = vips_object_get_property;
  292|       |
  293|      1|	object_class->nickname = "tiffload_source";
  294|      1|	object_class->description = _("load tiff from source");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  295|      1|	object_class->build = vips_foreign_load_tiff_source_build;
  296|       |
  297|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  298|       |
  299|      1|	load_class->is_a_source = vips_foreign_load_tiff_source_is_a_source;
  300|       |
  301|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  302|      1|		_("Source"),
  303|      1|		_("Source to load from"),
  304|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  305|      1|		G_STRUCT_OFFSET(VipsForeignLoadTiffSource, source),
  306|      1|		VIPS_TYPE_SOURCE);
  307|      1|}
tiffload.c:vips_foreign_load_tiff_source_is_a_source:
  277|  11.2k|{
  278|  11.2k|	return vips__istiff_source(source);
  279|  11.2k|}
tiffload.c:vips_foreign_load_tiff_file_class_init:
  364|      1|{
  365|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  366|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  367|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  368|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  369|       |
  370|      1|	gobject_class->set_property = vips_object_set_property;
  371|      1|	gobject_class->get_property = vips_object_get_property;
  372|       |
  373|      1|	object_class->nickname = "tiffload";
  374|      1|	object_class->description = _("load tiff from file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  375|      1|	object_class->build = vips_foreign_load_tiff_file_build;
  376|       |
  377|      1|	foreign_class->suffs = vips__foreign_tiff_suffs;
  378|       |
  379|      1|	load_class->is_a = vips_foreign_load_tiff_file_is_a;
  380|       |
  381|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  382|      1|		_("Filename"),
  383|      1|		_("Filename to load from"),
  384|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  385|      1|		G_STRUCT_OFFSET(VipsForeignLoadTiffFile, filename),
  386|      1|		NULL);
  387|      1|}
tiffload.c:vips_foreign_load_tiff_buffer_class_init:
  445|      1|{
  446|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  447|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  448|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  449|       |
  450|      1|	gobject_class->set_property = vips_object_set_property;
  451|      1|	gobject_class->get_property = vips_object_get_property;
  452|       |
  453|      1|	object_class->nickname = "tiffload_buffer";
  454|      1|	object_class->description = _("load tiff from buffer");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  455|      1|	object_class->build = vips_foreign_load_tiff_buffer_build;
  456|       |
  457|      1|	load_class->is_a_buffer = vips_foreign_load_tiff_buffer_is_a_buffer;
  458|       |
  459|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  460|      1|		_("Buffer"),
  461|      1|		_("Buffer to load from"),
  462|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  463|      1|		G_STRUCT_OFFSET(VipsForeignLoadTiffBuffer, blob),
  464|      1|		VIPS_TYPE_BLOB);
  465|      1|}
tiffload.c:vips_foreign_load_tiff_buffer_build:
  410|  4.86k|{
  411|  4.86k|	VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) object;
  412|  4.86k|	VipsForeignLoadTiffBuffer *buffer =
  413|  4.86k|		(VipsForeignLoadTiffBuffer *) object;
  414|       |
  415|  4.86k|	if (buffer->blob &&
  ------------------
  |  Branch (415:6): [True: 4.86k, False: 0]
  ------------------
  416|  4.86k|		!(tiff->source = vips_source_new_from_memory(
  ------------------
  |  Branch (416:3): [True: 0, False: 4.86k]
  ------------------
  417|  4.86k|			  VIPS_AREA(buffer->blob)->data,
  ------------------
  |  |  137|  4.86k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  418|  4.86k|			  VIPS_AREA(buffer->blob)->length)))
  ------------------
  |  |  137|  4.86k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  419|      0|		return -1;
  420|       |
  421|  4.86k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_tiff_buffer_parent_class)
  ------------------
  |  |  435|  4.86k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  4.86k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  4.86k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (421:6): [True: 929, False: 3.93k]
  ------------------
  422|  4.86k|			->build(object))
  423|    929|		return -1;
  424|       |
  425|  3.93k|	return 0;
  426|  4.86k|}
tiffload.c:vips_foreign_load_tiff_buffer_is_a_buffer:
  430|  11.2k|{
  431|  11.2k|	VipsSource *source;
  432|  11.2k|	gboolean result;
  433|       |
  434|  11.2k|	if (!(source = vips_source_new_from_memory(buf, len)))
  ------------------
  |  Branch (434:6): [True: 0, False: 11.2k]
  ------------------
  435|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  436|  11.2k|	result = vips_foreign_load_tiff_source_is_a_source(source);
  437|  11.2k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  11.2k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  11.2k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  11.2k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  11.2k|	{ \
  |  |  |  |   43|  11.2k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 11.2k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  11.2k|			(void) F((S)); \
  |  |  |  |   45|  11.2k|			(S) = 0; \
  |  |  |  |   46|  11.2k|		} \
  |  |  |  |   47|  11.2k|	} \
  |  |  |  |   48|  11.2k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  11.2k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  438|       |
  439|  11.2k|	return result;
  440|  11.2k|}
tiffload.c:vips_foreign_load_tiff_buffer_init:
  469|  4.86k|{
  470|  4.86k|}

tiffsave.c:vips_foreign_save_tiff_class_init:
  237|      1|{
  238|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  239|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  240|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  241|      1|	VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
  242|       |
  243|      1|	gobject_class->dispose = vips_foreign_save_tiff_dispose;
  244|      1|	gobject_class->set_property = vips_object_set_property;
  245|      1|	gobject_class->get_property = vips_object_get_property;
  246|       |
  247|      1|	object_class->nickname = "tiffsave_base";
  248|      1|	object_class->description = _("save image as tiff");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  249|      1|	object_class->build = vips_foreign_save_tiff_build;
  250|       |
  251|      1|	foreign_class->suffs = vips__foreign_tiff_suffs;
  252|       |
  253|      1|	save_class->saveable = VIPS_SAVEABLE_ANY;
  254|      1|	save_class->coding[VIPS_CODING_LABQ] = TRUE;
  ------------------
  |  |  798|      1|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      1|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  255|       |
  256|      1|	VIPS_ARG_ENUM(class, "compression", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  257|      1|		_("Compression"),
  258|      1|		_("Compression for this file"),
  259|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  260|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, compression),
  261|      1|		VIPS_TYPE_FOREIGN_TIFF_COMPRESSION,
  262|      1|		VIPS_FOREIGN_TIFF_COMPRESSION_NONE);
  263|       |
  264|      1|	VIPS_ARG_INT(class, "Q", 7,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  265|      1|		_("Q"),
  266|      1|		_("Q factor"),
  267|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  268|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, Q),
  269|      1|		1, 100, 75);
  270|       |
  271|      1|	VIPS_ARG_ENUM(class, "predictor", 8,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  272|      1|		_("Predictor"),
  273|      1|		_("Compression prediction"),
  274|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  275|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, predictor),
  276|      1|		VIPS_TYPE_FOREIGN_TIFF_PREDICTOR,
  277|      1|		VIPS_FOREIGN_TIFF_PREDICTOR_HORIZONTAL);
  278|       |
  279|      1|	VIPS_ARG_BOOL(class, "tile", 10,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  280|      1|		_("Tile"),
  281|      1|		_("Write a tiled tiff"),
  282|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  283|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, tile),
  284|      1|		FALSE);
  285|       |
  286|      1|	VIPS_ARG_INT(class, "tile_width", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  287|      1|		_("Tile width"),
  288|      1|		_("Tile width in pixels"),
  289|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  290|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, tile_width),
  291|      1|		1, 32768, 128);
  292|       |
  293|      1|	VIPS_ARG_INT(class, "tile_height", 12,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  294|      1|		_("Tile height"),
  295|      1|		_("Tile height in pixels"),
  296|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  297|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, tile_height),
  298|      1|		1, 32768, 128);
  299|       |
  300|      1|	VIPS_ARG_BOOL(class, "pyramid", 13,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  301|      1|		_("Pyramid"),
  302|      1|		_("Write a pyramidal tiff"),
  303|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  304|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, pyramid),
  305|      1|		FALSE);
  306|       |
  307|      1|	VIPS_ARG_BOOL(class, "miniswhite", 14,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  308|      1|		_("Miniswhite"),
  309|      1|		_("Use 0 for white in 1-bit images"),
  310|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  311|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, miniswhite),
  312|      1|		FALSE);
  313|       |
  314|      1|	VIPS_ARG_INT(class, "bitdepth", 15,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  315|      1|		_("Bit depth"),
  316|      1|		_("Write as a 1, 2, 4 or 8 bit image"),
  317|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  318|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, bitdepth),
  319|      1|		0, 8, 0);
  320|       |
  321|      1|	VIPS_ARG_ENUM(class, "resunit", 16,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  322|      1|		_("Resolution unit"),
  323|      1|		_("Resolution unit"),
  324|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  325|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, resunit),
  326|      1|		VIPS_TYPE_FOREIGN_TIFF_RESUNIT, VIPS_FOREIGN_TIFF_RESUNIT_CM);
  327|       |
  328|      1|	VIPS_ARG_DOUBLE(class, "xres", 17,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  329|      1|		_("Xres"),
  330|      1|		_("Horizontal resolution in pixels/mm"),
  331|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  332|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, xres),
  333|      1|		0.001, 1000000, 1);
  334|       |
  335|      1|	VIPS_ARG_DOUBLE(class, "yres", 18,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  336|      1|		_("Yres"),
  337|      1|		_("Vertical resolution in pixels/mm"),
  338|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  339|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, yres),
  340|      1|		0.001, 1000000, 1);
  341|       |
  342|      1|	VIPS_ARG_BOOL(class, "bigtiff", 19,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  343|      1|		_("Bigtiff"),
  344|      1|		_("Write a bigtiff image"),
  345|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  346|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, bigtiff),
  347|      1|		FALSE);
  348|       |
  349|      1|	VIPS_ARG_BOOL(class, "properties", 21,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  350|      1|		_("Properties"),
  351|      1|		_("Write a properties document to IMAGEDESCRIPTION"),
  352|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  353|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, properties),
  354|      1|		FALSE);
  355|       |
  356|      1|	VIPS_ARG_ENUM(class, "region_shrink", 22,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  357|      1|		_("Region shrink"),
  358|      1|		_("Method to shrink regions"),
  359|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  360|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, region_shrink),
  361|      1|		VIPS_TYPE_REGION_SHRINK, VIPS_REGION_SHRINK_MEAN);
  362|       |
  363|      1|	VIPS_ARG_INT(class, "level", 23,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  364|      1|		_("Level"),
  365|      1|		_("Deflate (1-9, default 6) or ZSTD (1-22, default 9) compression level"),
  366|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  367|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, level),
  368|      1|		0, 22, 0);
  369|       |
  370|      1|	VIPS_ARG_BOOL(class, "lossless", 24,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  371|      1|		_("Lossless"),
  372|      1|		_("Enable WEBP lossless mode"),
  373|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  374|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, lossless),
  375|      1|		FALSE);
  376|       |
  377|      1|	VIPS_ARG_ENUM(class, "depth", 25,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  378|      1|		_("Depth"),
  379|      1|		_("Pyramid depth"),
  380|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  381|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, depth),
  382|      1|		VIPS_TYPE_FOREIGN_DZ_DEPTH, VIPS_FOREIGN_DZ_DEPTH_ONETILE);
  383|       |
  384|      1|	VIPS_ARG_BOOL(class, "subifd", 26,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  385|      1|		_("Sub-IFD"),
  386|      1|		_("Save pyr layers as sub-IFDs"),
  387|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  388|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, subifd),
  389|      1|		FALSE);
  390|       |
  391|      1|	VIPS_ARG_BOOL(class, "premultiply", 27,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  392|      1|		_("Premultiply"),
  393|      1|		_("Save with premultiplied alpha"),
  394|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  395|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, premultiply),
  396|      1|		FALSE);
  397|       |
  398|      1|	VIPS_ARG_BOOL(class, "rgbjpeg", 28,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  399|      1|		_("RGB JPEG"),
  400|      1|		_("Output RGB JPEG rather than YCbCr"),
  401|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  402|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, rgbjpeg),
  403|      1|		FALSE);
  404|       |
  405|      1|	VIPS_ARG_BOOL(class, "squash", 29,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  406|      1|		_("Squash"),
  407|      1|		_("Squash images down to 1 bit"),
  408|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  409|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiff, squash),
  410|      1|		FALSE);
  411|      1|}
tiffsave.c:vips_foreign_save_tiff_target_class_init:
  462|      1|{
  463|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  464|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  465|       |
  466|      1|	gobject_class->set_property = vips_object_set_property;
  467|      1|	gobject_class->get_property = vips_object_get_property;
  468|       |
  469|      1|	object_class->nickname = "tiffsave_target";
  470|      1|	object_class->description = _("save image to tiff target");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  471|      1|	object_class->build = vips_foreign_save_tiff_target_build;
  472|       |
  473|      1|	VIPS_ARG_OBJECT(class, "target", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  474|      1|		_("Target"),
  475|      1|		_("Target to save to"),
  476|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  477|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiffTarget, target),
  478|      1|		VIPS_TYPE_TARGET);
  479|      1|}
tiffsave.c:vips_foreign_save_tiff_file_class_init:
  515|      1|{
  516|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  517|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  518|       |
  519|      1|	gobject_class->set_property = vips_object_set_property;
  520|      1|	gobject_class->get_property = vips_object_get_property;
  521|       |
  522|      1|	object_class->nickname = "tiffsave";
  523|      1|	object_class->description = _("save image to tiff file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  524|      1|	object_class->build = vips_foreign_save_tiff_file_build;
  525|       |
  526|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  527|      1|		_("Filename"),
  528|      1|		_("Filename to save to"),
  529|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  530|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiffFile, filename),
  531|      1|		NULL);
  532|      1|}
tiffsave.c:vips_foreign_save_tiff_buffer_class_init:
  576|      1|{
  577|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  578|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  579|       |
  580|      1|	gobject_class->set_property = vips_object_set_property;
  581|      1|	gobject_class->get_property = vips_object_get_property;
  582|       |
  583|      1|	object_class->nickname = "tiffsave_buffer";
  584|      1|	object_class->description = _("save image to tiff buffer");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  585|      1|	object_class->build = vips_foreign_save_tiff_buffer_build;
  586|       |
  587|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  588|      1|		_("Buffer"),
  589|      1|		_("Buffer to save to"),
  590|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  591|      1|		G_STRUCT_OFFSET(VipsForeignSaveTiffBuffer, buf),
  592|      1|		VIPS_TYPE_BLOB);
  593|      1|}

vips__new_output_message:
  172|  7.20k|{
  173|  7.20k|	char buffer[JMSG_LENGTH_MAX];
  174|       |
  175|  7.20k|	(*cinfo->err->format_message)(cinfo, buffer);
  176|  7.20k|	vips_error("VipsJpeg", _("%s"), buffer);
  ------------------
  |  |   30|  7.20k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  7.20k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  177|       |
  178|       |#ifdef DEBUG
  179|       |	printf("vips__new_output_message: \"%s\"\n", buffer);
  180|       |#endif /*DEBUG*/
  181|  7.20k|}
vips__new_error_exit:
  187|  1.95k|{
  188|  1.95k|	ErrorManager *eman = (ErrorManager *) cinfo->err;
  189|       |
  190|       |#ifdef DEBUG
  191|       |	printf("vips__new_error_exit:\n");
  192|       |#endif /*DEBUG*/
  193|       |
  194|       |	/* Close the fp if necessary.
  195|       |	 */
  196|  1.95k|	if (eman->fp) {
  ------------------
  |  Branch (196:6): [True: 0, False: 1.95k]
  ------------------
  197|      0|		(void) fclose(eman->fp);
  198|      0|		eman->fp = NULL;
  199|      0|	}
  200|       |
  201|       |	/* Send the error message to VIPS. This method is overridden above.
  202|       |	 */
  203|  1.95k|	(*cinfo->err->output_message)(cinfo);
  204|       |
  205|       |	/* Jump back.
  206|       |	 */
  207|  1.95k|	longjmp(eman->jmp, 1);
  208|  1.95k|}

vipsload.c:vips_foreign_load_vips_class_init:
  147|      1|{
  148|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  149|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  150|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  151|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  152|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  153|       |
  154|      1|	gobject_class->dispose = vips_foreign_load_vips_dispose;
  155|       |
  156|      1|	object_class->nickname = "vipsload_base";
  157|      1|	object_class->description = _("load vips base class");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  158|       |
  159|       |	/* You're unlikely to want to use this on untrusted files.
  160|       |	 */
  161|      1|	operation_class->flags |= VIPS_OPERATION_UNTRUSTED;
  162|       |
  163|       |	/* We are fast at is_a(), so high priority.
  164|       |	 */
  165|      1|	foreign_class->priority = 200;
  166|       |
  167|      1|	load_class->get_flags = vips_foreign_load_vips_get_flags;
  168|      1|	load_class->get_flags_filename =
  169|      1|		vips_foreign_load_vips_get_flags_filename;
  170|      1|	load_class->header = vips_foreign_load_vips_header;
  171|      1|	load_class->load = NULL;
  172|      1|}
vipsload.c:vips_foreign_load_vips_file_class_init:
  218|      1|{
  219|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  220|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  221|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  222|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  223|       |
  224|      1|	gobject_class->set_property = vips_object_set_property;
  225|      1|	gobject_class->get_property = vips_object_get_property;
  226|       |
  227|      1|	object_class->nickname = "vipsload";
  228|      1|	object_class->description = _("load vips from file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  229|      1|	object_class->build = vips_foreign_load_vips_file_build;
  230|       |
  231|      1|	foreign_class->suffs = vips__suffs;
  232|       |
  233|      1|	load_class->is_a = vips_foreign_load_vips_file_is_a;
  234|       |
  235|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  236|      1|		_("Filename"),
  237|      1|		_("Filename to load from"),
  238|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  239|      1|		G_STRUCT_OFFSET(VipsForeignLoadVipsFile, filename),
  240|      1|		NULL);
  241|      1|}
vipsload.c:vips_foreign_load_vips_source_class_init:
  293|      1|{
  294|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  295|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  296|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  297|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  298|       |
  299|      1|	gobject_class->set_property = vips_object_set_property;
  300|      1|	gobject_class->get_property = vips_object_get_property;
  301|       |
  302|      1|	object_class->nickname = "vipsload_source";
  303|      1|	object_class->description = _("load vips from source");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  304|      1|	object_class->build = vips_foreign_load_vips_source_build;
  305|       |
  306|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  307|       |
  308|      1|	load_class->is_a_source =
  309|      1|		vips_foreign_load_vips_source_is_a_source;
  310|       |
  311|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  312|      1|		_("Source"),
  313|      1|		_("Source to load from"),
  314|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  315|      1|		G_STRUCT_OFFSET(VipsForeignLoadVipsSource, source),
  316|      1|		VIPS_TYPE_SOURCE);
  317|      1|}

vipssave.c:vips_foreign_save_vips_class_init:
  130|      1|{
  131|      1|	int i;
  132|       |
  133|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  134|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  135|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  136|      1|	VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
  137|       |
  138|      1|	gobject_class->dispose = vips_foreign_save_vips_dispose;
  139|       |
  140|      1|	object_class->nickname = "vipssave_base";
  141|      1|	object_class->description = _("save vips base class");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  142|      1|	object_class->build = vips_foreign_save_vips_build;
  143|       |
  144|      1|	foreign_class->suffs = vips__suffs;
  145|       |
  146|      1|	save_class->saveable = VIPS_SAVEABLE_ANY;
  147|      8|	for (i = 0; i < VIPS_CODING_LAST; i++)
  ------------------
  |  Branch (147:14): [True: 7, False: 1]
  ------------------
  148|      7|		save_class->coding[i] = TRUE;
  ------------------
  |  |  798|      7|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      7|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  149|      1|}
vipssave.c:vips_foreign_save_vips_file_class_init:
  185|      1|{
  186|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  187|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  188|       |
  189|      1|	gobject_class->set_property = vips_object_set_property;
  190|      1|	gobject_class->get_property = vips_object_get_property;
  191|       |
  192|      1|	object_class->nickname = "vipssave";
  193|      1|	object_class->description = _("save image to file in vips format");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  194|      1|	object_class->build = vips_foreign_save_vips_file_build;
  195|       |
  196|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  197|      1|		_("Filename"),
  198|      1|		_("Filename to save to"),
  199|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  200|      1|		G_STRUCT_OFFSET(VipsForeignSaveVipsFile, filename),
  201|      1|		NULL);
  202|      1|}
vipssave.c:vips_foreign_save_vips_target_class_init:
  241|      1|{
  242|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  243|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  244|       |
  245|      1|	gobject_class->set_property = vips_object_set_property;
  246|      1|	gobject_class->get_property = vips_object_get_property;
  247|       |
  248|      1|	object_class->nickname = "vipssave_target";
  249|      1|	object_class->description = _("save image to target in vips format");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  250|      1|	object_class->build = vips_foreign_save_vips_target_build;
  251|       |
  252|      1|	VIPS_ARG_OBJECT(class, "target", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  253|      1|		_("Target"),
  254|      1|		_("Target to save to"),
  255|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  256|      1|		G_STRUCT_OFFSET(VipsForeignSaveVipsTarget, target),
  257|      1|		VIPS_TYPE_TARGET);
  258|      1|}

vips__iswebp_source:
  318|  15.5k|{
  319|  15.5k|	const unsigned char *p;
  320|       |
  321|       |	/* WebP is "RIFF xxxx WEBP" at the start, so we need 12 bytes.
  322|       |	 */
  323|  15.5k|	if ((p = vips_source_sniff(source, 12)) &&
  ------------------
  |  Branch (323:6): [True: 15.3k, False: 131]
  ------------------
  324|  15.5k|		vips_isprefix("RIFF", (char *) p) &&
  ------------------
  |  Branch (324:3): [True: 922, False: 14.4k]
  ------------------
  325|  15.5k|		vips_isprefix("WEBP", (char *) p + 8))
  ------------------
  |  Branch (325:3): [True: 920, False: 2]
  ------------------
  326|    920|		return 1;
  327|       |
  328|  14.5k|	return 0;
  329|  15.5k|}
vips__webp_read_header_source:
  808|    920|{
  809|    920|	Read *read;
  810|       |
  811|    920|	if (!(read = read_new(out, source, page, n, scale)) ||
  ------------------
  |  Branch (811:6): [True: 0, False: 920]
  ------------------
  812|    920|		read_header(read, out))
  ------------------
  |  Branch (812:3): [True: 118, False: 802]
  ------------------
  813|    118|		return -1;
  814|       |
  815|    802|	return 0;
  816|    920|}
vips__webp_read_source:
  821|    749|{
  822|    749|	Read *read;
  823|       |
  824|    749|	if (!(read = read_new(out, source, page, n, scale)) ||
  ------------------
  |  Branch (824:6): [True: 0, False: 749]
  ------------------
  825|    749|		read_image(read, out))
  ------------------
  |  Branch (825:3): [True: 495, False: 254]
  ------------------
  826|    495|		return -1;
  827|       |
  828|    254|	return 0;
  829|    749|}
webp2vips.c:read_new:
  354|  1.66k|{
  355|  1.66k|	Read *read;
  356|       |
  357|  1.66k|	if (!(read = VIPS_NEW(NULL, Read)))
  ------------------
  |  |   70|  1.66k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  1.66k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  1.66k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  1.66k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  1.66k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (357:6): [True: 0, False: 1.66k]
  ------------------
  358|      0|		return NULL;
  359|       |
  360|  1.66k|	read->out = out;
  361|  1.66k|	read->source = source;
  362|  1.66k|	g_object_ref(source);
  363|  1.66k|	read->page = page;
  364|  1.66k|	read->n = n;
  365|  1.66k|	read->scale = scale;
  366|  1.66k|	read->delays = NULL;
  367|  1.66k|	read->demux = NULL;
  368|  1.66k|	read->frame = NULL;
  369|  1.66k|	read->dispose_method = WEBP_MUX_DISPOSE_NONE;
  370|  1.66k|	read->frame_no = 0;
  371|       |
  372|       |	/* Everything has to stay open until read has finished, unfortunately,
  373|       |	 * since webp relies on us mapping the whole source.
  374|       |	 */
  375|  1.66k|	g_signal_connect(out, "close",
  ------------------
  |  |  491|  1.66k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  376|  1.66k|		G_CALLBACK(read_close_cb), read);
  377|       |
  378|  1.66k|	WebPInitDecoderConfig(&read->config);
  379|  1.66k|	read->config.options.use_threads = 1;
  380|  1.66k|	read->config.output.is_external_memory = 1;
  381|       |
  382|       |	/* Map the whole source into memory.
  383|       |	 */
  384|  1.66k|	if (!(read->data.bytes =
  ------------------
  |  Branch (384:6): [True: 0, False: 1.66k]
  ------------------
  385|  1.66k|				vips_source_map(source, &read->data.size)))
  386|      0|		return NULL;
  387|       |
  388|  1.66k|	return read;
  389|  1.66k|}
webp2vips.c:read_close_cb:
  348|  1.66k|{
  349|  1.66k|	read_free(read);
  350|  1.66k|}
webp2vips.c:read_free:
  333|  1.66k|{
  334|  1.66k|	WebPDemuxReleaseIterator(&read->iter);
  335|  1.66k|	VIPS_UNREF(read->frame);
  ------------------
  |  |   57|  1.66k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  1.66k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  1.66k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  1.66k|	{ \
  |  |  |  |   43|  1.66k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 1.54k, False: 118]
  |  |  |  |  ------------------
  |  |  |  |   44|  1.54k|			(void) F((S)); \
  |  |  |  |   45|  1.54k|			(S) = 0; \
  |  |  |  |   46|  1.54k|		} \
  |  |  |  |   47|  1.66k|	} \
  |  |  |  |   48|  1.66k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  1.66k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  336|  1.66k|	VIPS_FREEF(WebPDemuxDelete, read->demux);
  ------------------
  |  |   41|  1.66k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.66k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.66k|	{ \
  |  |   43|  1.66k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.55k, False: 117]
  |  |  ------------------
  |  |   44|  1.55k|			(void) F((S)); \
  |  |   45|  1.55k|			(S) = 0; \
  |  |   46|  1.55k|		} \
  |  |   47|  1.66k|	} \
  |  |   48|  1.66k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.66k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  337|  1.66k|	WebPFreeDecBuffer(&read->config.output);
  338|       |
  339|  1.66k|	VIPS_UNREF(read->source);
  ------------------
  |  |   57|  1.66k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  1.66k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  1.66k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  1.66k|	{ \
  |  |  |  |   43|  1.66k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 1.66k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  1.66k|			(void) F((S)); \
  |  |  |  |   45|  1.66k|			(S) = 0; \
  |  |  |  |   46|  1.66k|		} \
  |  |  |  |   47|  1.66k|	} \
  |  |  |  |   48|  1.66k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  1.66k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  340|  1.66k|	VIPS_FREE(read->delays);
  ------------------
  |  |   50|  1.66k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  1.66k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  1.66k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  1.66k|	{ \
  |  |  |  |   43|  1.66k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 1.66k]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|  1.66k|	} \
  |  |  |  |   48|  1.66k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  1.66k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  341|  1.66k|	VIPS_FREE(read);
  ------------------
  |  |   50|  1.66k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  1.66k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  1.66k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  1.66k|	{ \
  |  |  |  |   43|  1.66k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 1.66k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  1.66k|			(void) F((S)); \
  |  |  |  |   45|  1.66k|			(S) = 0; \
  |  |  |  |   46|  1.66k|		} \
  |  |  |  |   47|  1.66k|	} \
  |  |  |  |   48|  1.66k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  1.66k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  342|       |
  343|  1.66k|	return 0;
  344|  1.66k|}
webp2vips.c:read_header:
  402|  1.66k|{
  403|  1.66k|	int flags;
  404|  1.66k|	int i;
  405|       |
  406|  1.66k|	if (!(read->demux = WebPDemux(&read->data))) {
  ------------------
  |  Branch (406:6): [True: 117, False: 1.55k]
  ------------------
  407|    117|		vips_error("webp", "%s", _("unable to parse image"));
  ------------------
  |  |   30|    117|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    117|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  408|    117|		return -1;
  409|    117|	}
  410|       |
  411|  1.55k|	flags = WebPDemuxGetI(read->demux, WEBP_FF_FORMAT_FLAGS);
  412|       |
  413|  1.55k|	read->alpha = flags & ALPHA_FLAG;
  414|       |
  415|       |	/* We do everything as RGBA and then, if we can, drop the alpha on
  416|       |	 * save.
  417|       |	 */
  418|  1.55k|	read->config.output.colorspace = MODE_RGBA;
  419|       |
  420|  1.55k|	read->canvas_width =
  421|  1.55k|		WebPDemuxGetI(read->demux, WEBP_FF_CANVAS_WIDTH);
  422|  1.55k|	read->canvas_height =
  423|  1.55k|		WebPDemuxGetI(read->demux, WEBP_FF_CANVAS_HEIGHT);
  424|       |
  425|  1.55k|	if (flags & ANIMATION_FLAG) {
  ------------------
  |  Branch (425:6): [True: 0, False: 1.55k]
  ------------------
  426|      0|		int loop_count;
  427|      0|		WebPIterator iter;
  428|       |
  429|      0|		loop_count = WebPDemuxGetI(read->demux, WEBP_FF_LOOP_COUNT);
  430|      0|		read->frame_count = WebPDemuxGetI(read->demux,
  431|      0|			WEBP_FF_FRAME_COUNT);
  432|       |
  433|       |#ifdef DEBUG
  434|       |		printf("webp2vips: animation\n");
  435|       |		printf("webp2vips: loop_count = %d\n", loop_count);
  436|       |		printf("webp2vips: frame_count = %d\n", read->frame_count);
  437|       |#endif /*DEBUG*/
  438|       |
  439|      0|		vips_image_set_int(out, "loop", loop_count);
  440|       |
  441|       |		/* DEPRECATED "gif-loop"
  442|       |		 *
  443|       |		 * Not the correct behavior as loop=1 became gif-loop=0
  444|       |		 * but we want to keep the old behavior untouched!
  445|       |		 */
  446|      0|		vips_image_set_int(out, "gif-loop",
  447|      0|			loop_count == 0 ? 0 : loop_count - 1);
  ------------------
  |  Branch (447:4): [True: 0, False: 0]
  ------------------
  448|       |
  449|      0|		if (WebPDemuxGetFrame(read->demux, 1, &iter)) {
  ------------------
  |  Branch (449:7): [True: 0, False: 0]
  ------------------
  450|      0|			int i;
  451|       |
  452|      0|			read->delays = (int *)
  453|      0|				g_malloc0(read->frame_count * sizeof(int));
  454|      0|			for (i = 0; i < read->frame_count; i++)
  ------------------
  |  Branch (454:16): [True: 0, False: 0]
  ------------------
  455|      0|				read->delays[i] = 40;
  456|       |
  457|      0|			do {
  458|      0|				g_assert(iter.frame_num >= 1 &&
  ------------------
  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  459|      0|					iter.frame_num <= read->frame_count);
  460|       |
  461|      0|				read->delays[iter.frame_num - 1] =
  462|      0|					iter.duration;
  463|       |
  464|       |				/* We need the alpha in an animation if:
  465|       |				 *   - any frame has transparent pixels
  466|       |				 *   - any frame doesn't fill the whole canvas.
  467|       |				 */
  468|      0|				if (iter.has_alpha ||
  ------------------
  |  Branch (468:9): [True: 0, False: 0]
  ------------------
  469|      0|					iter.width != read->canvas_width ||
  ------------------
  |  Branch (469:6): [True: 0, False: 0]
  ------------------
  470|      0|					iter.height != read->canvas_height)
  ------------------
  |  Branch (470:6): [True: 0, False: 0]
  ------------------
  471|      0|					read->alpha = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  472|       |
  473|       |				/* We must disable shrink-on-load if any frame
  474|       |				 * does not fill the whole canvas. We won't be
  475|       |				 * able to shrink-on-load it to the exact
  476|       |				 * position in a downsized canvas.
  477|       |				 */
  478|      0|				if (iter.width != read->canvas_width ||
  ------------------
  |  Branch (478:9): [True: 0, False: 0]
  ------------------
  479|      0|					iter.height != read->canvas_height)
  ------------------
  |  Branch (479:6): [True: 0, False: 0]
  ------------------
  480|      0|					read->scale = 1.0;
  481|      0|			} while (WebPDemuxNextFrame(&iter));
  ------------------
  |  Branch (481:13): [True: 0, False: 0]
  ------------------
  482|       |
  483|      0|			vips_image_set_array_int(out,
  484|      0|				"delay", read->delays, read->frame_count);
  485|       |
  486|       |			/* webp uses ms for delays, gif uses centiseconds.
  487|       |			 */
  488|      0|			vips_image_set_int(out, "gif-delay",
  489|      0|				VIPS_RINT(read->delays[0] / 10.0));
  ------------------
  |  |   74|      0|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  490|      0|		}
  491|       |
  492|      0|		WebPDemuxReleaseIterator(&iter);
  493|       |
  494|      0|		if (read->n == -1)
  ------------------
  |  Branch (494:7): [True: 0, False: 0]
  ------------------
  495|      0|			read->n = read->frame_count - read->page;
  496|       |
  497|      0|		if (read->page < 0 ||
  ------------------
  |  Branch (497:7): [True: 0, False: 0]
  ------------------
  498|      0|			read->n <= 0 ||
  ------------------
  |  Branch (498:4): [True: 0, False: 0]
  ------------------
  499|      0|			read->page + read->n > read->frame_count) {
  ------------------
  |  Branch (499:4): [True: 0, False: 0]
  ------------------
  500|      0|			vips_error("webp",
  501|      0|				"%s", _("bad page number"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  502|      0|			return -1;
  503|      0|		}
  504|       |
  505|       |		/* Note that n-pages is the number of pages in the original,
  506|       |		 * not the number of pages in the image we are writing.
  507|       |		 */
  508|      0|		vips_image_set_int(out, VIPS_META_N_PAGES, read->frame_count);
  ------------------
  |  |  165|      0|#define VIPS_META_N_PAGES "n-pages"
  ------------------
  509|      0|	}
  510|       |
  511|       |	/* We round-to-nearest cf. pdfload etc.
  512|       |	 */
  513|  1.55k|	read->frame_width = VIPS_RINT(read->canvas_width * read->scale);
  ------------------
  |  |   74|  1.55k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  514|  1.55k|	read->frame_height = VIPS_RINT(read->canvas_height * read->scale);
  ------------------
  |  |   74|  1.55k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  515|       |
  516|       |#ifdef DEBUG
  517|       |	printf("webp2vips: canvas_width = %d\n", read->canvas_width);
  518|       |	printf("webp2vips: canvas_height = %d\n", read->canvas_height);
  519|       |	printf("webp2vips: frame_width = %d\n", read->frame_width);
  520|       |	printf("webp2vips: frame_height = %d\n", read->frame_height);
  521|       |#endif /*DEBUG*/
  522|       |
  523|  1.55k|	if (flags & ANIMATION_FLAG) {
  ------------------
  |  Branch (523:6): [True: 0, False: 1.55k]
  ------------------
  524|       |		/* Only set page-height if we have more than one page, or
  525|       |		 * this could accidentally turn into an animated image later.
  526|       |		 */
  527|      0|		if (read->n > 1)
  ------------------
  |  Branch (527:7): [True: 0, False: 0]
  ------------------
  528|      0|			vips_image_set_int(out,
  529|      0|				VIPS_META_PAGE_HEIGHT, read->frame_height);
  ------------------
  |  |  158|      0|#define VIPS_META_PAGE_HEIGHT "page-height"
  ------------------
  530|       |
  531|      0|		read->width = read->frame_width;
  532|      0|		read->height = read->n * read->frame_height;
  533|      0|	}
  534|  1.55k|	else {
  535|  1.55k|		read->width = read->frame_width;
  536|  1.55k|		read->height = read->frame_height;
  537|  1.55k|		read->frame_count = 1;
  538|  1.55k|	}
  539|       |
  540|       |	/* height can be huge if this is an animated webp image.
  541|       |	 */
  542|  1.55k|	if (read->width <= 0 ||
  ------------------
  |  Branch (542:6): [True: 0, False: 1.55k]
  ------------------
  543|  1.55k|		read->height <= 0 ||
  ------------------
  |  Branch (543:3): [True: 0, False: 1.55k]
  ------------------
  544|  1.55k|		read->width > 0x3FFF ||
  ------------------
  |  Branch (544:3): [True: 1, False: 1.55k]
  ------------------
  545|  1.55k|		read->height >= VIPS_MAX_COORD ||
  ------------------
  |  |   69|  3.10k|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (545:3): [True: 0, False: 1.55k]
  ------------------
  546|  1.55k|		read->frame_width <= 0 ||
  ------------------
  |  Branch (546:3): [True: 0, False: 1.55k]
  ------------------
  547|  1.55k|		read->frame_height <= 0 ||
  ------------------
  |  Branch (547:3): [True: 0, False: 1.55k]
  ------------------
  548|  1.55k|		read->frame_width > 0x3FFF ||
  ------------------
  |  Branch (548:3): [True: 0, False: 1.55k]
  ------------------
  549|  1.55k|		read->frame_height > 0x3FFF) {
  ------------------
  |  Branch (549:3): [True: 0, False: 1.55k]
  ------------------
  550|      1|		vips_error("webp", "%s", _("bad image dimensions"));
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  551|      1|		return -1;
  552|      1|	}
  553|       |
  554|  6.20k|	for (i = 0; i < vips__n_webp_names; i++) {
  ------------------
  |  Branch (554:14): [True: 4.65k, False: 1.55k]
  ------------------
  555|  4.65k|		const char *vips = vips__webp_names[i].vips;
  556|  4.65k|		const char *webp = vips__webp_names[i].webp;
  557|       |
  558|  4.65k|		if (flags & vips__webp_names[i].flags) {
  ------------------
  |  Branch (558:7): [True: 0, False: 4.65k]
  ------------------
  559|      0|			WebPChunkIterator iter;
  560|       |
  561|      0|			WebPDemuxGetChunk(read->demux, webp, 1, &iter);
  562|      0|			vips_image_set_blob_copy(out,
  563|      0|				vips, iter.chunk.bytes, iter.chunk.size);
  564|      0|			WebPDemuxReleaseChunkIterator(&iter);
  565|      0|		}
  566|  4.65k|	}
  567|       |
  568|       |	/* The canvas is always RGBA, we drop alpha to RGB on output if we
  569|       |	 * can.
  570|       |	 */
  571|  1.55k|	read->frame = vips_image_new_memory();
  572|  1.55k|	vips_image_init_fields(read->frame,
  573|  1.55k|		read->frame_width, read->frame_height, 4,
  574|  1.55k|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  575|  1.55k|		VIPS_INTERPRETATION_sRGB,
  576|  1.55k|		1.0, 1.0);
  577|  1.55k|	if (vips_image_pipelinev(read->frame,
  ------------------
  |  Branch (577:6): [True: 0, False: 1.55k]
  ------------------
  578|  1.55k|			VIPS_DEMAND_STYLE_THINSTRIP, NULL) ||
  579|  1.55k|		vips_image_write_prepare(read->frame))
  ------------------
  |  Branch (579:3): [True: 0, False: 1.55k]
  ------------------
  580|      0|		return -1;
  581|       |
  582|  1.55k|	vips_image_init_fields(out,
  583|  1.55k|		read->width, read->height,
  584|  1.55k|		read->alpha ? 4 : 3,
  ------------------
  |  Branch (584:3): [True: 236, False: 1.31k]
  ------------------
  585|  1.55k|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  586|  1.55k|		VIPS_INTERPRETATION_sRGB,
  587|  1.55k|		1.0, 1.0);
  588|  1.55k|	if (vips_image_pipelinev(out, VIPS_DEMAND_STYLE_THINSTRIP, NULL))
  ------------------
  |  Branch (588:6): [True: 0, False: 1.55k]
  ------------------
  589|      0|		return -1;
  590|  1.55k|	VIPS_SETSTR(out->filename,
  ------------------
  |  |   53|  1.55k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.55k|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|  1.55k|	{ \
  |  |   55|  1.55k|		const char *sst = (V); \
  |  |   56|  1.55k|		\
  |  |   57|  1.55k|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 1.55k, False: 0]
  |  |  ------------------
  |  |   58|  1.55k|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 1.55k]
  |  |  |  Branch (58:16): [True: 1.55k, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|  1.55k|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|  1.55k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|  1.55k|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  1.55k|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|  1.55k|	{ \
  |  |  |  |  |  |   43|  1.55k|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 1.55k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.55k|			(void) F((S)); \
  |  |  |  |  |  |   45|  1.55k|			(S) = 0; \
  |  |  |  |  |  |   46|  1.55k|		} \
  |  |  |  |  |  |   47|  1.55k|	} \
  |  |  |  |  |  |   48|  1.55k|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|  1.55k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|  1.55k|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 1.55k]
  |  |  ------------------
  |  |   61|  1.55k|					(S) = g_strdup(sst); \
  |  |   62|  1.55k|			} \
  |  |   63|  1.55k|		} \
  |  |   64|  1.55k|	} \
  |  |   65|  1.55k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.55k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  591|  1.55k|		vips_connection_filename(VIPS_CONNECTION(read->source)));
  592|       |
  593|  1.55k|	if (!WebPDemuxGetFrame(read->demux, 1, &read->iter)) {
  ------------------
  |  Branch (593:6): [True: 0, False: 1.55k]
  ------------------
  594|      0|		vips_error("webp",
  595|      0|			"%s", _("unable to loop through frames"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  596|      0|		return -1;
  597|      0|	}
  598|       |
  599|  1.55k|	return 0;
  600|  1.55k|}
webp2vips.c:read_image:
  786|    749|{
  787|    749|	VipsImage **t = (VipsImage **)
  788|    749|		vips_object_local_array(VIPS_OBJECT(out), 2);
  ------------------
  |  |  433|    749|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    749|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    749|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  789|       |
  790|       |	/* Make the output pipeline.
  791|       |	 */
  792|    749|	t[0] = vips_image_new();
  793|    749|	if (read_header(read, t[0]))
  ------------------
  |  Branch (793:6): [True: 0, False: 749]
  ------------------
  794|      0|		return -1;
  795|       |
  796|    749|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (796:6): [True: 0, False: 749]
  ------------------
  797|    749|			NULL, read_webp_generate, NULL, read, NULL) ||
  798|    749|		vips_sequential(t[0], &t[1], NULL) ||
  ------------------
  |  Branch (798:3): [True: 0, False: 749]
  ------------------
  799|    749|		vips_image_write(t[1], out))
  ------------------
  |  Branch (799:3): [True: 495, False: 254]
  ------------------
  800|    495|		return -1;
  801|       |
  802|    254|	return 0;
  803|    749|}
webp2vips.c:read_webp_generate:
  735|  21.2k|{
  736|  21.2k|	VipsRect *r = &out_region->valid;
  737|  21.2k|	Read *read = (Read *) a;
  738|       |
  739|       |	/* iter.frame_num numbers from 1.
  740|       |	 */
  741|  21.2k|	int frame = 1 + r->top / read->frame_height + read->page;
  742|  21.2k|	int line = r->top % read->frame_height;
  743|       |
  744|       |#ifdef DEBUG_VERBOSE
  745|       |	printf("read_webp_generate: line %d\n", r->top);
  746|       |#endif /*DEBUG_VERBOSE*/
  747|       |
  748|  21.2k|	g_assert(r->height == 1);
  ------------------
  |  |  166|  21.2k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  21.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  21.2k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  749|       |
  750|  21.4k|	while (read->frame_no < frame) {
  ------------------
  |  Branch (750:9): [True: 749, False: 20.7k]
  ------------------
  751|    749|		if (read_next_frame(read))
  ------------------
  |  Branch (751:7): [True: 495, False: 254]
  ------------------
  752|    495|			return -1;
  753|       |
  754|    254|		read->frame_no += 1;
  755|    254|	}
  756|       |
  757|  20.7k|	if (out_region->im->Bands == 4)
  ------------------
  |  Branch (757:6): [True: 2.30k, False: 18.4k]
  ------------------
  758|  2.30k|		memcpy(VIPS_REGION_ADDR(out_region, 0, r->top),
  ------------------
  |  |  227|  2.30k|	((R)->data + \
  |  |  228|  2.30k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  2.30k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  2.30k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  2.30k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  2.30k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  2.30k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  759|  2.30k|			VIPS_IMAGE_ADDR(read->frame, 0, line),
  ------------------
  |  |  418|  2.30k|	((I)->data + \
  |  |  419|  2.30k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|  2.30k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  2.30k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  2.30k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|  2.30k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|  2.30k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  2.30k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  760|  2.30k|			VIPS_IMAGE_SIZEOF_LINE(read->frame));
  ------------------
  |  |  386|  2.30k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|  2.30k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  2.30k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  761|  18.4k|	else {
  762|  18.4k|		int x;
  763|  18.4k|		VipsPel *p;
  764|  18.4k|		VipsPel *q;
  765|       |
  766|       |		/* We know that alpha is solid, so we can just drop the 4th
  767|       |		 * band.
  768|       |		 */
  769|  18.4k|		p = VIPS_IMAGE_ADDR(read->frame, 0, line);
  ------------------
  |  |  418|  18.4k|	((I)->data + \
  |  |  419|  18.4k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|  18.4k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  18.4k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  18.4k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|  18.4k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|  18.4k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  18.4k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  770|  18.4k|		q = VIPS_REGION_ADDR(out_region, 0, r->top);
  ------------------
  |  |  227|  18.4k|	((R)->data + \
  |  |  228|  18.4k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  18.4k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  18.4k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  18.4k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  18.4k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  18.4k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  771|  1.49M|		for (x = 0; x < r->width; x++) {
  ------------------
  |  Branch (771:15): [True: 1.47M, False: 18.4k]
  ------------------
  772|  1.47M|			q[0] = p[0];
  773|  1.47M|			q[1] = p[1];
  774|  1.47M|			q[2] = p[2];
  775|       |
  776|  1.47M|			q += 3;
  777|  1.47M|			p += 4;
  778|  1.47M|		}
  779|  18.4k|	}
  780|       |
  781|  20.7k|	return 0;
  782|  21.2k|}
webp2vips.c:read_next_frame:
  647|    749|{
  648|    749|	VipsImage *frame;
  649|    749|	VipsRect area;
  650|       |
  651|       |#ifdef DEBUG
  652|       |	printf("read_next_frame:\n");
  653|       |#endif /*DEBUG*/
  654|       |
  655|       |	/* Area of this frame, in output image coordinates. We must rint(),
  656|       |	 * since we need the same rules as the overall image scale, or we'll
  657|       |	 * sometimes have missing pixels on edges.
  658|       |	 */
  659|    749|	area.left = VIPS_RINT(read->iter.x_offset * read->scale);
  ------------------
  |  |   74|    749|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  660|    749|	area.top = VIPS_RINT(read->iter.y_offset * read->scale);
  ------------------
  |  |   74|    749|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  661|    749|	area.width = VIPS_RINT(read->iter.width * read->scale);
  ------------------
  |  |   74|    749|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  662|    749|	area.height = VIPS_RINT(read->iter.height * read->scale);
  ------------------
  |  |   74|    749|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  663|       |
  664|       |	/* Dispose from the previous frame.
  665|       |	 */
  666|    749|	if (read->dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) {
  ------------------
  |  Branch (666:6): [True: 0, False: 749]
  ------------------
  667|       |		/* We must clear the pixels occupied by the previous webp
  668|       |		 * frame (not the whole of the read frame) to 0 (transparent).
  669|       |		 *
  670|       |		 * We do not clear to WEBP_FF_BACKGROUND_COLOR. That's only
  671|       |		 * used to composite down to RGB. Perhaps we
  672|       |		 * should attach background as metadata.
  673|       |		 */
  674|      0|		guint32 zero = 0;
  675|       |
  676|      0|		vips_image_paint_area(read->frame,
  677|      0|			&read->dispose_rect, (VipsPel *) &zero);
  678|      0|	}
  679|       |
  680|       |	/* Note this frame's dispose for next time.
  681|       |	 */
  682|    749|	read->dispose_method = read->iter.dispose_method;
  683|    749|	read->dispose_rect = area;
  684|       |
  685|       |#ifdef DEBUG
  686|       |	printf("webp2vips: frame_num = %d\n", read->iter.frame_num);
  687|       |	printf("   left = %d\n", area.left);
  688|       |	printf("   top = %d\n", area.top);
  689|       |	printf("   width = %d\n", area.width);
  690|       |	printf("   height = %d\n", area.height);
  691|       |	printf("   duration = %d\n", read->iter.duration);
  692|       |	printf("   dispose = ");
  693|       |	if (read->iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND)
  694|       |		printf("clear to background\n");
  695|       |	else
  696|       |		printf("none\n");
  697|       |	printf("   has_alpha = %d\n", read->iter.has_alpha);
  698|       |	printf("   blend_method = ");
  699|       |	if (read->iter.blend_method == WEBP_MUX_BLEND)
  700|       |		printf("blend with previous\n");
  701|       |	else
  702|       |		printf("don't blend\n");
  703|       |#endif /*DEBUG*/
  704|       |
  705|    749|	if (!(frame = read_frame(read,
  ------------------
  |  Branch (705:6): [True: 495, False: 254]
  ------------------
  706|    749|			  area.width, area.height,
  707|    749|			  read->iter.fragment.bytes, read->iter.fragment.size)))
  708|    495|		return -1;
  709|       |
  710|       |	/* Now blend or copy the new pixels into our accumulator.
  711|       |	 */
  712|    254|	vips_image_paint_image(read->frame, frame,
  713|    254|		area.left, area.top,
  714|    254|		read->iter.frame_num > 1 &&
  ------------------
  |  Branch (714:3): [True: 0, False: 254]
  ------------------
  715|    254|			read->iter.blend_method == WEBP_MUX_BLEND);
  ------------------
  |  Branch (715:4): [True: 0, False: 0]
  ------------------
  716|       |
  717|    254|	g_object_unref(frame);
  718|       |
  719|       |	/* If there's another frame, move on.
  720|       |	 */
  721|    254|	if (read->iter.frame_num < read->frame_count) {
  ------------------
  |  Branch (721:6): [True: 0, False: 254]
  ------------------
  722|      0|		if (!WebPDemuxNextFrame(&read->iter)) {
  ------------------
  |  Branch (722:7): [True: 0, False: 0]
  ------------------
  723|      0|			vips_error("webp2vips",
  724|      0|				"%s", _("not enough frames"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  725|      0|			return -1;
  726|      0|		}
  727|      0|	}
  728|       |
  729|    254|	return 0;
  730|    254|}
webp2vips.c:read_frame:
  608|    749|{
  609|    749|	VipsImage *frame;
  610|       |
  611|       |#ifdef DEBUG
  612|       |	printf("read_frame:\n");
  613|       |#endif /*DEBUG*/
  614|       |
  615|    749|	frame = vips_image_new_memory();
  616|    749|	vips_image_init_fields(frame,
  617|    749|		width, height, 4,
  618|    749|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  619|    749|		VIPS_INTERPRETATION_sRGB,
  620|    749|		1.0, 1.0);
  621|    749|	if (vips_image_pipelinev(frame, VIPS_DEMAND_STYLE_THINSTRIP, NULL) ||
  ------------------
  |  Branch (621:6): [True: 0, False: 749]
  ------------------
  622|    749|		vips_image_write_prepare(frame)) {
  ------------------
  |  Branch (622:3): [True: 0, False: 749]
  ------------------
  623|      0|		g_object_unref(frame);
  624|      0|		return NULL;
  625|      0|	}
  626|       |
  627|    749|	read->config.output.u.RGBA.rgba = VIPS_IMAGE_ADDR(frame, 0, 0);
  ------------------
  |  |  418|    749|	((I)->data + \
  |  |  419|    749|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|    749|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|    749|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|    749|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|    749|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|    749|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|    749|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  628|    749|	read->config.output.u.RGBA.stride = VIPS_IMAGE_SIZEOF_LINE(frame);
  ------------------
  |  |  386|    749|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|    749|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|    749|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  629|    749|	read->config.output.u.RGBA.size = VIPS_IMAGE_SIZEOF_IMAGE(frame);
  ------------------
  |  |  388|    749|	(VIPS_IMAGE_SIZEOF_LINE(I) * (I)->Ysize)
  |  |  ------------------
  |  |  |  |  386|    749|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|    749|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|    749|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  630|    749|	if (read->scale != 1.0) {
  ------------------
  |  Branch (630:6): [True: 0, False: 749]
  ------------------
  631|      0|		read->config.options.use_scaling = 1;
  632|      0|		read->config.options.scaled_width = width;
  633|      0|		read->config.options.scaled_height = height;
  634|      0|	}
  635|       |
  636|    749|	if (WebPDecode(data, length, &read->config) != VP8_STATUS_OK) {
  ------------------
  |  Branch (636:6): [True: 495, False: 254]
  ------------------
  637|    495|		g_object_unref(frame);
  638|    495|		vips_error("webp2vips", "%s", _("unable to read pixels"));
  ------------------
  |  |   30|    495|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    495|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  639|    495|		return NULL;
  640|    495|	}
  641|       |
  642|    254|	return frame;
  643|    749|}
webp2vips.c:vips_image_paint_image:
  281|    254|{
  282|    254|	VipsRect frame_rect = { 0, 0, frame->Xsize, frame->Ysize };
  283|    254|	VipsRect sub_rect = { left, top, sub->Xsize, sub->Ysize };
  284|    254|	int ps = VIPS_IMAGE_SIZEOF_PEL(frame);
  ------------------
  |  |  384|    254|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|    254|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  285|       |
  286|    254|	VipsRect ovl;
  287|       |
  288|    254|	g_assert(VIPS_IMAGE_SIZEOF_PEL(sub) == ps);
  ------------------
  |  |  166|    254|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    254|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    254|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  289|       |
  290|    254|	vips_rect_intersectrect(&frame_rect, &sub_rect, &ovl);
  291|    254|	if (!vips_rect_isempty(&ovl)) {
  ------------------
  |  Branch (291:6): [True: 254, False: 0]
  ------------------
  292|    254|		VipsPel *p, *q;
  293|    254|		int x, y;
  294|       |
  295|    254|		p = VIPS_IMAGE_ADDR(sub, ovl.left - left, ovl.top - top);
  ------------------
  |  |  418|    254|	((I)->data + \
  |  |  419|    254|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|    254|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|    254|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|    254|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|    254|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|    254|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|    254|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  296|    254|		q = VIPS_IMAGE_ADDR(frame, ovl.left, ovl.top);
  ------------------
  |  |  418|    254|	((I)->data + \
  |  |  419|    254|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|    254|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|    254|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|    254|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|    254|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|    254|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|    254|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  297|       |
  298|  20.9k|		for (y = 0; y < ovl.height; y++) {
  ------------------
  |  Branch (298:15): [True: 20.7k, False: 254]
  ------------------
  299|  20.7k|			if (blend) {
  ------------------
  |  Branch (299:8): [True: 0, False: 20.7k]
  ------------------
  300|      0|				guint32 *A = (guint32 *) p;
  301|      0|				guint32 *B = (guint32 *) q;
  302|       |
  303|      0|				for (x = 0; x < ovl.width; x++)
  ------------------
  |  Branch (303:17): [True: 0, False: 0]
  ------------------
  304|      0|					B[x] = blend_pixel(A[x], B[x]);
  305|      0|			}
  306|  20.7k|			else
  307|  20.7k|				memcpy((char *) q, (char *) p,
  308|  20.7k|					ovl.width * ps);
  309|       |
  310|  20.7k|			p += VIPS_IMAGE_SIZEOF_LINE(sub);
  ------------------
  |  |  386|  20.7k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|  20.7k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  20.7k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  311|  20.7k|			q += VIPS_IMAGE_SIZEOF_LINE(frame);
  ------------------
  |  |  386|  20.7k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|  20.7k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  20.7k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  312|  20.7k|		}
  313|    254|	}
  314|    254|}

webpload.c:vips_foreign_load_webp_class_init:
  153|      1|{
  154|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  155|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  156|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  157|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  158|       |
  159|      1|	gobject_class->dispose = vips_foreign_load_webp_dispose;
  160|      1|	gobject_class->set_property = vips_object_set_property;
  161|      1|	gobject_class->get_property = vips_object_get_property;
  162|       |
  163|      1|	object_class->nickname = "webpload_base";
  164|      1|	object_class->description = _("load webp");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  165|      1|	object_class->build = vips_foreign_load_webp_build;
  166|       |
  167|       |	/* We are fast at is_a(), so high priority.
  168|       |	 */
  169|      1|	foreign_class->priority = 200;
  170|       |
  171|      1|	load_class->get_flags_filename =
  172|      1|		vips_foreign_load_webp_get_flags_filename;
  173|      1|	load_class->get_flags = vips_foreign_load_webp_get_flags;
  174|      1|	load_class->header = vips_foreign_load_webp_header;
  175|      1|	load_class->load = vips_foreign_load_webp_load;
  176|       |
  177|      1|	VIPS_ARG_INT(class, "page", 20,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  178|      1|		_("Page"),
  179|      1|		_("First page to load"),
  180|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  181|      1|		G_STRUCT_OFFSET(VipsForeignLoadWebp, page),
  182|      1|		0, 100000, 0);
  183|       |
  184|      1|	VIPS_ARG_INT(class, "n", 21,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  185|      1|		_("n"),
  186|      1|		_("Number of pages to load, -1 for all"),
  187|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  188|      1|		G_STRUCT_OFFSET(VipsForeignLoadWebp, n),
  189|      1|		-1, 100000, 1);
  190|       |
  191|      1|	VIPS_ARG_DOUBLE(class, "scale", 22,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  192|      1|		_("Scale"),
  193|      1|		_("Factor to scale by"),
  194|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  195|      1|		G_STRUCT_OFFSET(VipsForeignLoadWebp, scale),
  196|      1|		0.0, 1024.0, 1.0);
  197|       |
  198|      1|	VIPS_ARG_INT(class, "shrink", 23,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  199|      1|		_("Shrink"),
  200|      1|		_("Shrink factor on load"),
  201|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  202|      1|		G_STRUCT_OFFSET(VipsForeignLoadWebp, shrink),
  203|      1|		1, 1024, 1);
  204|      1|}
webpload.c:vips_foreign_load_webp_dispose:
   89|    919|{
   90|    919|	VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) gobject;
   91|       |
   92|    919|	VIPS_UNREF(webp->source);
  ------------------
  |  |   57|    919|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|    919|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    919|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    919|	{ \
  |  |  |  |   43|    919|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 919, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|    919|			(void) F((S)); \
  |  |  |  |   45|    919|			(S) = 0; \
  |  |  |  |   46|    919|		} \
  |  |  |  |   47|    919|	} \
  |  |  |  |   48|    919|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    919|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   93|       |
   94|    919|	G_OBJECT_CLASS(vips_foreign_load_webp_parent_class)->dispose(gobject);
  ------------------
  |  |   58|    919|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|    919|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    919|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   95|    919|}
webpload.c:vips_foreign_load_webp_build:
   99|    920|{
  100|    920|	VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) object;
  101|       |
  102|       |	/* BC for the old API.
  103|       |	 */
  104|    920|	if (!vips_object_argument_isset(VIPS_OBJECT(webp), "scale") &&
  ------------------
  |  |  433|    920|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    920|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    920|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (104:6): [True: 920, False: 0]
  ------------------
  105|    920|		vips_object_argument_isset(VIPS_OBJECT(webp), "shrink") &&
  ------------------
  |  |  433|    920|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    920|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    920|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (105:3): [True: 0, False: 920]
  ------------------
  106|    920|		webp->shrink != 0)
  ------------------
  |  Branch (106:3): [True: 0, False: 0]
  ------------------
  107|      0|		webp->scale = 1.0 / webp->shrink; // FIXME: Invalidates operation cache
  108|       |
  109|    920|	if (VIPS_OBJECT_CLASS(vips_foreign_load_webp_parent_class)->build(object))
  ------------------
  |  |  435|    920|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    920|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    920|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (109:6): [True: 118, False: 802]
  ------------------
  110|    118|		return -1;
  111|       |
  112|    802|	return 0;
  113|    920|}
webpload.c:vips_foreign_load_webp_get_flags:
  117|    920|{
  118|    920|	return 0;
  119|    920|}
webpload.c:vips_foreign_load_webp_header:
  129|    920|{
  130|    920|	VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) load;
  131|       |
  132|    920|	if (vips__webp_read_header_source(webp->source, load->out,
  ------------------
  |  Branch (132:6): [True: 118, False: 802]
  ------------------
  133|    920|			webp->page, webp->n, webp->scale))
  134|    118|		return -1;
  135|       |
  136|    802|	return 0;
  137|    920|}
webpload.c:vips_foreign_load_webp_load:
  141|    749|{
  142|    749|	VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) load;
  143|       |
  144|    749|	if (vips__webp_read_source(webp->source, load->real,
  ------------------
  |  Branch (144:6): [True: 495, False: 254]
  ------------------
  145|    749|			webp->page, webp->n, webp->scale))
  146|    495|		return -1;
  147|       |
  148|    254|	return 0;
  149|    749|}
webpload.c:vips_foreign_load_webp_init:
  208|    920|{
  209|    920|	webp->n = 1;
  210|    920|	webp->shrink = 1;
  211|    920|	webp->scale = 1.0;
  212|    920|}
webpload.c:vips_foreign_load_webp_source_class_init:
  248|      1|{
  249|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  251|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  252|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  253|       |
  254|      1|	gobject_class->set_property = vips_object_set_property;
  255|      1|	gobject_class->get_property = vips_object_get_property;
  256|       |
  257|      1|	object_class->nickname = "webpload_source";
  258|      1|	object_class->description = _("load webp from source");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  259|      1|	object_class->build = vips_foreign_load_webp_source_build;
  260|       |
  261|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  262|       |
  263|      1|	load_class->is_a_source = vips__iswebp_source;
  264|       |
  265|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  266|      1|		_("Source"),
  267|      1|		_("Source to load from"),
  268|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  269|      1|		G_STRUCT_OFFSET(VipsForeignLoadWebpSource, source),
  270|      1|		VIPS_TYPE_SOURCE);
  271|      1|}
webpload.c:vips_foreign_load_webp_file_class_init:
  328|      1|{
  329|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  331|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  332|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  333|       |
  334|      1|	gobject_class->set_property = vips_object_set_property;
  335|      1|	gobject_class->get_property = vips_object_get_property;
  336|       |
  337|      1|	object_class->nickname = "webpload";
  338|      1|	object_class->description = _("load webp from file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  339|      1|	object_class->build = vips_foreign_load_webp_file_build;
  340|       |
  341|      1|	foreign_class->suffs = vips__webp_suffs;
  342|       |
  343|      1|	load_class->is_a = vips_foreign_load_webp_file_is_a;
  344|       |
  345|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  346|      1|		_("Filename"),
  347|      1|		_("Filename to load from"),
  348|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  349|      1|		G_STRUCT_OFFSET(VipsForeignLoadWebpFile, filename),
  350|      1|		NULL);
  351|      1|}
webpload.c:vips_foreign_load_webp_buffer_class_init:
  409|      1|{
  410|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  411|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  412|      1|	VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class;
  413|       |
  414|      1|	gobject_class->set_property = vips_object_set_property;
  415|      1|	gobject_class->get_property = vips_object_get_property;
  416|       |
  417|      1|	object_class->nickname = "webpload_buffer";
  418|      1|	object_class->description = _("load webp from buffer");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  419|      1|	object_class->build = vips_foreign_load_webp_buffer_build;
  420|       |
  421|      1|	load_class->is_a_buffer = vips_foreign_load_webp_buffer_is_a_buffer;
  422|       |
  423|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  424|      1|		_("Buffer"),
  425|      1|		_("Buffer to load from"),
  426|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  427|      1|		G_STRUCT_OFFSET(VipsForeignLoadWebpBuffer, blob),
  428|      1|		VIPS_TYPE_BLOB);
  429|      1|}
webpload.c:vips_foreign_load_webp_buffer_build:
  374|    920|{
  375|    920|	VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) object;
  376|    920|	VipsForeignLoadWebpBuffer *buffer =
  377|    920|		(VipsForeignLoadWebpBuffer *) object;
  378|       |
  379|    920|	if (buffer->blob &&
  ------------------
  |  Branch (379:6): [True: 920, False: 0]
  ------------------
  380|    920|		!(webp->source = vips_source_new_from_memory(
  ------------------
  |  Branch (380:3): [True: 0, False: 920]
  ------------------
  381|    920|			  VIPS_AREA(buffer->blob)->data,
  ------------------
  |  |  137|    920|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  382|    920|			  VIPS_AREA(buffer->blob)->length)))
  ------------------
  |  |  137|    920|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  383|      0|		return -1;
  384|       |
  385|    920|	if (VIPS_OBJECT_CLASS(vips_foreign_load_webp_buffer_parent_class)
  ------------------
  |  |  435|    920|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    920|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    920|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (385:6): [True: 118, False: 802]
  ------------------
  386|    920|			->build(object))
  387|    118|		return -1;
  388|       |
  389|    802|	return 0;
  390|    920|}
webpload.c:vips_foreign_load_webp_buffer_is_a_buffer:
  394|  15.5k|{
  395|  15.5k|	VipsSource *source;
  396|  15.5k|	gboolean result;
  397|       |
  398|  15.5k|	if (!(source = vips_source_new_from_memory(buf, len)))
  ------------------
  |  Branch (398:6): [True: 0, False: 15.5k]
  ------------------
  399|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  400|  15.5k|	result = vips__iswebp_source(source);
  401|  15.5k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  15.5k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  15.5k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  15.5k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  15.5k|	{ \
  |  |  |  |   43|  15.5k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 15.5k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  15.5k|			(void) F((S)); \
  |  |  |  |   45|  15.5k|			(S) = 0; \
  |  |  |  |   46|  15.5k|		} \
  |  |  |  |   47|  15.5k|	} \
  |  |  |  |   48|  15.5k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  15.5k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  402|       |
  403|  15.5k|	return result;
  404|  15.5k|}
webpload.c:vips_foreign_load_webp_buffer_init:
  433|    920|{
  434|    920|}

webpsave.c:vips_foreign_save_webp_class_init:
  806|      1|{
  807|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  808|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  809|      1|	VipsForeignClass *foreign_class = (VipsForeignClass *) class;
  810|      1|	VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;
  811|       |
  812|      1|	gobject_class->dispose = vips_foreign_save_webp_dispose;
  813|      1|	gobject_class->set_property = vips_object_set_property;
  814|      1|	gobject_class->get_property = vips_object_get_property;
  815|       |
  816|      1|	object_class->nickname = "webpsave_base";
  817|      1|	object_class->description = _("save as WebP");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  818|      1|	object_class->build = vips_foreign_save_webp_build;
  819|       |
  820|      1|	foreign_class->suffs = vips__save_webp_suffs;
  821|       |
  822|      1|	save_class->saveable = VIPS_SAVEABLE_RGBA_ONLY;
  823|      1|	save_class->format_table = bandfmt_webp;
  824|       |
  825|      1|	VIPS_ARG_INT(class, "Q", 10,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  826|      1|		_("Q"),
  827|      1|		_("Q factor"),
  828|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  829|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, Q),
  830|      1|		0, 100, 75);
  831|       |
  832|      1|	VIPS_ARG_BOOL(class, "lossless", 11,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  833|      1|		_("Lossless"),
  834|      1|		_("Enable lossless compression"),
  835|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  836|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, lossless),
  837|      1|		FALSE);
  838|       |
  839|      1|	VIPS_ARG_ENUM(class, "preset", 12,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  840|      1|		_("Preset"),
  841|      1|		_("Preset for lossy compression"),
  842|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  843|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, preset),
  844|      1|		VIPS_TYPE_FOREIGN_WEBP_PRESET,
  845|      1|		VIPS_FOREIGN_WEBP_PRESET_DEFAULT);
  846|       |
  847|      1|	VIPS_ARG_BOOL(class, "smart_subsample", 13,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  848|      1|		_("Smart subsampling"),
  849|      1|		_("Enable high quality chroma subsampling"),
  850|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  851|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, smart_subsample),
  852|      1|		FALSE);
  853|       |
  854|      1|	VIPS_ARG_BOOL(class, "near_lossless", 14,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  855|      1|		_("Near lossless"),
  856|      1|		_("Enable preprocessing in lossless mode (uses Q)"),
  857|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  858|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, near_lossless),
  859|      1|		FALSE);
  860|       |
  861|      1|	VIPS_ARG_INT(class, "alpha_q", 15,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  862|      1|		_("Alpha quality"),
  863|      1|		_("Change alpha plane fidelity for lossy compression"),
  864|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  865|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, alpha_q),
  866|      1|		0, 100, 100);
  867|       |
  868|      1|	VIPS_ARG_BOOL(class, "min_size", 16,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  869|      1|		_("Minimise size"),
  870|      1|		_("Optimise for minimum size"),
  871|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  872|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, min_size),
  873|      1|		FALSE);
  874|       |
  875|      1|	VIPS_ARG_INT(class, "kmin", 17,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  876|      1|		_("Minimum keyframe spacing"),
  877|      1|		_("Minimum number of frames between key frames"),
  878|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  879|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, kmin),
  880|      1|		0, INT_MAX, INT_MAX - 1);
  881|       |
  882|      1|	VIPS_ARG_INT(class, "kmax", 18,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  883|      1|		_("Maximum keyframe spacing"),
  884|      1|		_("Maximum number of frames between key frames"),
  885|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  886|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, kmax),
  887|      1|		0, INT_MAX, INT_MAX);
  888|       |
  889|      1|	VIPS_ARG_INT(class, "effort", 19,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  890|      1|		_("Effort"),
  891|      1|		_("Level of CPU effort to reduce file size"),
  892|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  893|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, effort),
  894|      1|		0, 6, 4);
  895|       |
  896|      1|	VIPS_ARG_INT(class, "target_size", 20,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  897|      1|		_("Target size"),
  898|      1|		_("Desired target size in bytes"),
  899|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  900|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, target_size),
  901|      1|		0, INT_MAX, 0);
  902|       |
  903|      1|	VIPS_ARG_INT(class, "passes", 23,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  904|      1|		_("Passes"),
  905|      1|		_("Number of entropy-analysis passes (in [1..10])"),
  906|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  907|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, passes),
  908|      1|		1, 10, 1);
  909|       |
  910|      1|	VIPS_ARG_INT(class, "reduction_effort", 21,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  911|      1|		_("Reduction effort"),
  912|      1|		_("Level of CPU effort to reduce file size"),
  913|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  914|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, effort),
  915|      1|		0, 6, 4);
  916|       |
  917|      1|	VIPS_ARG_BOOL(class, "mixed", 22,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  918|      1|		_("Mixed encoding"),
  919|      1|		_("Allow mixed encoding (might reduce file size)"),
  920|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  921|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, mixed),
  922|      1|		FALSE);
  923|       |
  924|      1|	VIPS_ARG_BOOL(class, "smart_deblock", 23,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  925|      1|		_("Smart deblocking"),
  926|      1|		_("Enable auto-adjusting of the deblocking filter"),
  927|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  928|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebp, smart_deblock),
  929|      1|		FALSE);
  930|      1|}
webpsave.c:vips_foreign_save_webp_target_class_init:
  976|      1|{
  977|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  978|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  979|       |
  980|      1|	gobject_class->set_property = vips_object_set_property;
  981|      1|	gobject_class->get_property = vips_object_get_property;
  982|       |
  983|      1|	object_class->nickname = "webpsave_target";
  984|      1|	object_class->build = vips_foreign_save_webp_target_build;
  985|       |
  986|      1|	VIPS_ARG_OBJECT(class, "target", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
  987|      1|		_("Target"),
  988|      1|		_("Target to save to"),
  989|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  990|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebpTarget, target),
  991|      1|		VIPS_TYPE_TARGET);
  992|      1|}
webpsave.c:vips_foreign_save_webp_file_class_init:
 1027|      1|{
 1028|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1029|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1030|       |
 1031|      1|	gobject_class->set_property = vips_object_set_property;
 1032|      1|	gobject_class->get_property = vips_object_get_property;
 1033|       |
 1034|      1|	object_class->nickname = "webpsave";
 1035|      1|	object_class->build = vips_foreign_save_webp_file_build;
 1036|       |
 1037|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1038|      1|		_("Filename"),
 1039|      1|		_("Filename to save to"),
 1040|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1041|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebpFile, filename),
 1042|      1|		NULL);
 1043|      1|}
webpsave.c:vips_foreign_save_webp_buffer_class_init:
 1085|      1|{
 1086|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1087|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1088|       |
 1089|      1|	gobject_class->set_property = vips_object_set_property;
 1090|      1|	gobject_class->get_property = vips_object_get_property;
 1091|       |
 1092|      1|	object_class->nickname = "webpsave_buffer";
 1093|      1|	object_class->build = vips_foreign_save_webp_buffer_build;
 1094|       |
 1095|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
 1096|      1|		_("Buffer"),
 1097|      1|		_("Buffer to save to"),
 1098|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
 1099|      1|		G_STRUCT_OFFSET(VipsForeignSaveWebpBuffer, buf),
 1100|      1|		VIPS_TYPE_BLOB);
 1101|      1|}
webpsave.c:vips_foreign_save_webp_mime_class_init:
 1152|      1|{
 1153|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1154|       |
 1155|      1|	object_class->nickname = "webpsave_mime";
 1156|      1|	object_class->description = _("save image to webp mime");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1157|      1|	object_class->build = vips_foreign_save_webp_mime_build;
 1158|      1|}

vips_freqfilt_operation_init:
  163|      2|{
  164|      2|#ifdef HAVE_FFTW
  165|      2|	extern GType vips_fwfft_get_type(void);
  166|      2|	extern GType vips_invfft_get_type(void);
  167|      2|#endif /*HAVE_FFTW*/
  168|      2|	extern GType vips_freqmult_get_type(void);
  169|      2|	extern GType vips_spectrum_get_type(void);
  170|      2|	extern GType vips_phasecor_get_type(void);
  171|       |
  172|      2|#ifdef HAVE_FFTW
  173|      2|	vips_fwfft_get_type();
  174|      2|	vips_invfft_get_type();
  175|      2|#endif /*HAVE_FFTW*/
  176|      2|	vips_freqmult_get_type();
  177|      2|	vips_spectrum_get_type();
  178|      2|	vips_phasecor_get_type();
  179|      2|}
freqfilt.c:vips_freqfilt_class_init:
   86|      1|{
   87|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   88|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   89|       |
   90|      1|	gobject_class->set_property = vips_object_set_property;
   91|      1|	gobject_class->get_property = vips_object_get_property;
   92|       |
   93|      1|	vobject_class->nickname = "freqfilt";
   94|      1|	vobject_class->description = _("frequency-domain filter operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   95|      1|	vobject_class->build = vips_freqfilt_build;
   96|       |
   97|      1|	VIPS_ARG_IMAGE(class, "in", -1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
   98|      1|		_("Input"),
   99|      1|		_("Input image"),
  100|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  101|      1|		G_STRUCT_OFFSET(VipsFreqfilt, in));
  102|       |
  103|      1|	VIPS_ARG_IMAGE(class, "out", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  104|      1|		_("Output"),
  105|      1|		_("Output image"),
  106|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  107|      1|		G_STRUCT_OFFSET(VipsFreqfilt, out));
  108|      1|}

freqmult.c:vips_freqmult_class_init:
  118|      1|{
  119|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  120|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  121|       |
  122|      1|	gobject_class->set_property = vips_object_set_property;
  123|      1|	gobject_class->get_property = vips_object_get_property;
  124|       |
  125|      1|	vobject_class->nickname = "freqmult";
  126|      1|	vobject_class->description = _("frequency-domain filtering");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  127|      1|	vobject_class->build = vips_freqmult_build;
  128|       |
  129|      1|	VIPS_ARG_IMAGE(class, "mask", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  130|      1|		_("Mask"),
  131|      1|		_("Input mask image"),
  132|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  133|      1|		G_STRUCT_OFFSET(VipsFreqmult, mask));
  134|      1|}

fwfft.c:vips_fwfft_class_init:
  347|      1|{
  348|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  349|       |
  350|      1|	vobject_class->nickname = "fwfft";
  351|      1|	vobject_class->description = _("forward FFT");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  352|      1|	vobject_class->build = vips_fwfft_build;
  353|      1|}

invfft.c:vips_invfft_class_init:
  255|      1|{
  256|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  257|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  258|       |
  259|      1|	gobject_class->set_property = vips_object_set_property;
  260|      1|	gobject_class->get_property = vips_object_get_property;
  261|       |
  262|      1|	vobject_class->nickname = "invfft";
  263|      1|	vobject_class->description = _("inverse FFT");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  264|      1|	vobject_class->build = vips_invfft_build;
  265|       |
  266|      1|	VIPS_ARG_BOOL(class, "real", 4,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  267|      1|		_("Real"),
  268|      1|		_("Output only the real part of the transform"),
  269|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  270|      1|		G_STRUCT_OFFSET(VipsInvfft, real),
  271|      1|		FALSE);
  272|      1|}

phasecor.c:vips_phasecor_class_init:
   99|      1|{
  100|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  101|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  102|       |
  103|      1|	gobject_class->set_property = vips_object_set_property;
  104|      1|	gobject_class->get_property = vips_object_get_property;
  105|       |
  106|      1|	vobject_class->nickname = "phasecor";
  107|      1|	vobject_class->description = _("calculate phase correlation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  108|      1|	vobject_class->build = vips_phasecor_build;
  109|       |
  110|      1|	VIPS_ARG_IMAGE(class, "in2", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  111|      1|		_("in2"),
  112|      1|		_("Second input image"),
  113|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  114|      1|		G_STRUCT_OFFSET(VipsPhasecor, in2));
  115|      1|}

spectrum.c:vips_spectrum_class_init:
   96|      1|{
   97|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|       |
   99|      1|	vobject_class->nickname = "spectrum";
  100|      1|	vobject_class->description = _("make displayable power spectrum");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  101|      1|	vobject_class->build = vips_spectrum_build;
  102|      1|}

case.c:vips_case_class_init:
  223|      1|{
  224|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  225|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  226|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  227|       |
  228|      1|	gobject_class->set_property = vips_object_set_property;
  229|      1|	gobject_class->get_property = vips_object_get_property;
  230|       |
  231|      1|	object_class->nickname = "case";
  232|      1|	object_class->description =
  233|      1|		_("use pixel values to pick cases from an array of images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  234|      1|	object_class->build = vips_case_build;
  235|       |
  236|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  237|       |
  238|      1|	VIPS_ARG_IMAGE(class, "index", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  239|      1|		_("Index"),
  240|      1|		_("Index image"),
  241|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  242|      1|		G_STRUCT_OFFSET(VipsCase, index));
  243|       |
  244|      1|	VIPS_ARG_BOXED(class, "cases", 2,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  245|      1|		_("Cases"),
  246|      1|		_("Array of case images"),
  247|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  248|      1|		G_STRUCT_OFFSET(VipsCase, cases),
  249|      1|		VIPS_TYPE_ARRAY_IMAGE);
  250|       |
  251|      1|	VIPS_ARG_IMAGE(class, "out", 3,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  252|      1|		_("Output"),
  253|      1|		_("Output image"),
  254|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  255|      1|		G_STRUCT_OFFSET(VipsCase, out));
  256|      1|}

hist_cum.c:vips_hist_cum_class_init:
  153|      1|{
  154|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  155|      1|	VipsHistogramClass *hclass = VIPS_HISTOGRAM_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_HISTOGRAM, VipsHistogramClass))
  ------------------
  156|       |
  157|      1|	object_class->nickname = "hist_cum";
  158|      1|	object_class->description = _("form cumulative histogram");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  159|       |
  160|      1|	hclass->format_table = vips_hist_cum_format_table;
  161|      1|	hclass->process = vips_hist_cum_process;
  162|      1|}

hist_entropy.c:vips_hist_entropy_class_init:
   99|      1|{
  100|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  101|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  102|       |
  103|      1|	gobject_class->set_property = vips_object_set_property;
  104|      1|	gobject_class->get_property = vips_object_get_property;
  105|       |
  106|      1|	object_class->nickname = "hist_entropy";
  107|      1|	object_class->description = _("estimate image entropy");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  108|      1|	object_class->build = vips_hist_entropy_build;
  109|       |
  110|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  111|      1|		_("Input"),
  112|      1|		_("Input histogram image"),
  113|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  114|      1|		G_STRUCT_OFFSET(VipsHistEntropy, in));
  115|       |
  116|      1|	VIPS_ARG_DOUBLE(class, "out", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  117|      1|		_("Output"),
  118|      1|		_("Output value"),
  119|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  120|      1|		G_STRUCT_OFFSET(VipsHistEntropy, out),
  121|      1|		-INFINITY, INFINITY, 0.0);
  122|      1|}

hist_equal.c:vips_hist_equal_class_init:
  102|      1|{
  103|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  104|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  105|       |
  106|      1|	gobject_class->set_property = vips_object_set_property;
  107|      1|	gobject_class->get_property = vips_object_get_property;
  108|       |
  109|      1|	object_class->nickname = "hist_equal";
  110|      1|	object_class->description = _("histogram equalisation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  111|      1|	object_class->build = vips_hist_equal_build;
  112|       |
  113|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  114|      1|		_("Input"),
  115|      1|		_("Input image"),
  116|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  117|      1|		G_STRUCT_OFFSET(VipsHistEqual, in));
  118|       |
  119|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  120|      1|		_("Output"),
  121|      1|		_("Output image"),
  122|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  123|      1|		G_STRUCT_OFFSET(VipsHistEqual, out));
  124|       |
  125|      1|	VIPS_ARG_INT(class, "band", 110,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  126|      1|		_("Band"),
  127|      1|		_("Equalise with this band"),
  128|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  129|      1|		G_STRUCT_OFFSET(VipsHistEqual, which),
  130|      1|		-1, 100000, -1);
  131|      1|}

hist_ismonotonic.c:vips_hist_ismonotonic_class_init:
  106|      1|{
  107|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  108|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  109|       |
  110|      1|	gobject_class->set_property = vips_object_set_property;
  111|      1|	gobject_class->get_property = vips_object_get_property;
  112|       |
  113|      1|	object_class->nickname = "hist_ismonotonic";
  114|      1|	object_class->description = _("test for monotonicity");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  115|      1|	object_class->build = vips_hist_ismonotonic_build;
  116|       |
  117|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  118|      1|		_("Input"),
  119|      1|		_("Input histogram image"),
  120|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  121|      1|		G_STRUCT_OFFSET(VipsHistIsmonotonic, in));
  122|       |
  123|      1|	VIPS_ARG_BOOL(class, "monotonic", 2,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  124|      1|		_("Monotonic"),
  125|      1|		_("true if in is monotonic"),
  126|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  127|      1|		G_STRUCT_OFFSET(VipsHistIsmonotonic, monotonic),
  128|      1|		FALSE);
  129|      1|}

hist_local.c:vips_hist_local_class_init:
  346|      1|{
  347|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  348|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  349|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  350|       |
  351|      1|	gobject_class->set_property = vips_object_set_property;
  352|      1|	gobject_class->get_property = vips_object_get_property;
  353|       |
  354|      1|	object_class->nickname = "hist_local";
  355|      1|	object_class->description = _("local histogram equalisation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  356|      1|	object_class->build = vips_hist_local_build;
  357|       |
  358|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  359|       |
  360|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  361|      1|		_("Input"),
  362|      1|		_("Input image"),
  363|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  364|      1|		G_STRUCT_OFFSET(VipsHistLocal, in));
  365|       |
  366|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  367|      1|		_("Output"),
  368|      1|		_("Output image"),
  369|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  370|      1|		G_STRUCT_OFFSET(VipsHistLocal, out));
  371|       |
  372|      1|	VIPS_ARG_INT(class, "width", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  373|      1|		_("Width"),
  374|      1|		_("Window width in pixels"),
  375|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  376|      1|		G_STRUCT_OFFSET(VipsHistLocal, width),
  377|      1|		1, VIPS_MAX_COORD, 1);
  378|       |
  379|      1|	VIPS_ARG_INT(class, "height", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  380|      1|		_("Height"),
  381|      1|		_("Window height in pixels"),
  382|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  383|      1|		G_STRUCT_OFFSET(VipsHistLocal, height),
  384|      1|		1, VIPS_MAX_COORD, 1);
  385|       |
  386|      1|	VIPS_ARG_INT(class, "max_slope", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  387|      1|		_("Max slope"),
  388|      1|		_("Maximum slope (CLAHE)"),
  389|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  390|      1|		G_STRUCT_OFFSET(VipsHistLocal, max_slope),
  391|      1|		0, 100, 0);
  392|      1|}

hist_match.c:vips_hist_match_class_init:
  145|      1|{
  146|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  147|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  148|      1|	VipsHistogramClass *hclass = VIPS_HISTOGRAM_CLASS(class);
  ------------------
  |  |   45|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|		VIPS_TYPE_HISTOGRAM, VipsHistogramClass))
  ------------------
  149|       |
  150|      1|	gobject_class->set_property = vips_object_set_property;
  151|      1|	gobject_class->get_property = vips_object_get_property;
  152|       |
  153|      1|	vobject_class->nickname = "hist_match";
  154|      1|	vobject_class->description = _("match two histograms");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  155|      1|	vobject_class->build = vips_hist_match_build;
  156|       |
  157|      1|	hclass->input_format = VIPS_FORMAT_UINT;
  158|      1|	hclass->process = vips_hist_match_process;
  159|       |
  160|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  161|      1|		_("Input"),
  162|      1|		_("Input histogram"),
  163|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  164|      1|		G_STRUCT_OFFSET(VipsHistMatch, in));
  165|       |
  166|      1|	VIPS_ARG_IMAGE(class, "ref", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  167|      1|		_("Reference"),
  168|      1|		_("Reference histogram"),
  169|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  170|      1|		G_STRUCT_OFFSET(VipsHistMatch, ref));
  171|      1|}

hist_norm.c:vips_hist_norm_class_init:
  129|      1|{
  130|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  131|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  132|       |
  133|      1|	gobject_class->set_property = vips_object_set_property;
  134|      1|	gobject_class->get_property = vips_object_get_property;
  135|       |
  136|      1|	object_class->nickname = "hist_norm";
  137|      1|	object_class->description = _("normalise histogram");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  138|      1|	object_class->build = vips_hist_norm_build;
  139|       |
  140|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  141|      1|		_("Input"),
  142|      1|		_("Input image"),
  143|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  144|      1|		G_STRUCT_OFFSET(VipsHistNorm, in));
  145|       |
  146|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  147|      1|		_("Output"),
  148|      1|		_("Output image"),
  149|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  150|      1|		G_STRUCT_OFFSET(VipsHistNorm, out));
  151|      1|}

hist_plot.c:vips_hist_plot_class_init:
  321|      1|{
  322|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  323|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  324|       |
  325|      1|	gobject_class->set_property = vips_object_set_property;
  326|      1|	gobject_class->get_property = vips_object_get_property;
  327|       |
  328|      1|	object_class->nickname = "hist_plot";
  329|      1|	object_class->description = _("plot histogram");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  330|      1|	object_class->build = vips_hist_plot_build;
  331|       |
  332|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  333|      1|		_("Input"),
  334|      1|		_("Input image"),
  335|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  336|      1|		G_STRUCT_OFFSET(VipsHistPlot, in));
  337|       |
  338|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  339|      1|		_("Output"),
  340|      1|		_("Output image"),
  341|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  342|      1|		G_STRUCT_OFFSET(VipsHistPlot, out));
  343|      1|}

hist_unary.c:vips_hist_unary_class_init:
   76|      1|{
   77|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   78|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   79|       |
   80|      1|	gobject_class->set_property = vips_object_set_property;
   81|      1|	gobject_class->get_property = vips_object_get_property;
   82|       |
   83|      1|	vobject_class->nickname = "hist_unary";
   84|      1|	vobject_class->description = _("hist_unary operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   85|      1|	vobject_class->build = vips_hist_unary_build;
   86|       |
   87|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
   88|      1|		_("Input"),
   89|      1|		_("Input image"),
   90|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
   91|      1|		G_STRUCT_OFFSET(VipsHistUnary, in));
   92|      1|}

vips_histogram_operation_init:
  251|      2|{
  252|      2|	extern GType vips_maplut_get_type(void);
  253|      2|	extern GType vips_case_get_type(void);
  254|      2|	extern GType vips_percent_get_type(void);
  255|      2|	extern GType vips_hist_cum_get_type(void);
  256|      2|	extern GType vips_hist_norm_get_type(void);
  257|      2|	extern GType vips_hist_equal_get_type(void);
  258|      2|	extern GType vips_hist_plot_get_type(void);
  259|      2|	extern GType vips_hist_match_get_type(void);
  260|      2|	extern GType vips_hist_local_get_type(void);
  261|      2|	extern GType vips_hist_ismonotonic_get_type(void);
  262|      2|	extern GType vips_hist_entropy_get_type(void);
  263|      2|	extern GType vips_stdif_get_type(void);
  264|       |
  265|      2|	vips_maplut_get_type();
  266|      2|	vips_case_get_type();
  267|      2|	vips_percent_get_type();
  268|      2|	vips_stdif_get_type();
  269|      2|	vips_hist_cum_get_type();
  270|      2|	vips_hist_norm_get_type();
  271|      2|	vips_hist_equal_get_type();
  272|      2|	vips_hist_plot_get_type();
  273|      2|	vips_hist_match_get_type();
  274|      2|	vips_hist_local_get_type();
  275|      2|	vips_hist_ismonotonic_get_type();
  276|      2|	vips_hist_entropy_get_type();
  277|      2|}
histogram.c:vips_histogram_class_init:
  215|      1|{
  216|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  217|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  218|       |
  219|      1|	gobject_class->set_property = vips_object_set_property;
  220|      1|	gobject_class->get_property = vips_object_get_property;
  221|       |
  222|      1|	vobject_class->nickname = "histogram";
  223|      1|	vobject_class->description = _("histogram operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  224|      1|	vobject_class->build = vips_histogram_build;
  225|       |
  226|      1|	class->input_format = VIPS_FORMAT_NOTSET;
  227|       |
  228|       |	/* Inputs set by subclassess.
  229|       |	 */
  230|       |
  231|      1|	VIPS_ARG_IMAGE(class, "out", 10,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  232|      1|		_("Output"),
  233|      1|		_("Output image"),
  234|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  235|      1|		G_STRUCT_OFFSET(VipsHistogram, out));
  236|      1|}

maplut.c:vips_maplut_class_init:
  729|      1|{
  730|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  731|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  732|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  733|       |
  734|      1|	gobject_class->set_property = vips_object_set_property;
  735|      1|	gobject_class->get_property = vips_object_get_property;
  736|       |
  737|      1|	object_class->nickname = "maplut";
  738|      1|	object_class->description = _("map an image though a lut");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  739|      1|	object_class->build = vips_maplut_build;
  740|       |
  741|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  742|       |
  743|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  744|      1|		_("Input"),
  745|      1|		_("Input image"),
  746|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  747|      1|		G_STRUCT_OFFSET(VipsMaplut, in));
  748|       |
  749|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  750|      1|		_("Output"),
  751|      1|		_("Output image"),
  752|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  753|      1|		G_STRUCT_OFFSET(VipsMaplut, out));
  754|       |
  755|      1|	VIPS_ARG_IMAGE(class, "lut", 3,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  756|      1|		_("LUT"),
  757|      1|		_("Look-up table image"),
  758|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  759|      1|		G_STRUCT_OFFSET(VipsMaplut, lut));
  760|       |
  761|      1|	VIPS_ARG_INT(class, "band", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  762|      1|		_("Band"),
  763|      1|		_("Apply one-band lut to this band of in"),
  764|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  765|      1|		G_STRUCT_OFFSET(VipsMaplut, band),
  766|      1|		-1, 10000, -1);
  767|      1|}

percent.c:vips_percent_class_init:
   97|      1|{
   98|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   99|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  100|       |
  101|      1|	gobject_class->set_property = vips_object_set_property;
  102|      1|	gobject_class->get_property = vips_object_get_property;
  103|       |
  104|      1|	object_class->nickname = "percent";
  105|      1|	object_class->description = _("find threshold for percent of pixels");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  106|      1|	object_class->build = vips_percent_build;
  107|       |
  108|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  109|      1|		_("Input"),
  110|      1|		_("Input image"),
  111|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  112|      1|		G_STRUCT_OFFSET(VipsPercent, in));
  113|       |
  114|      1|	VIPS_ARG_DOUBLE(class, "percent", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  115|      1|		_("Percent"),
  116|      1|		_("Percent of pixels"),
  117|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  118|      1|		G_STRUCT_OFFSET(VipsPercent, percent),
  119|      1|		0, 100, 50);
  120|       |
  121|      1|	VIPS_ARG_INT(class, "threshold", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  122|      1|		_("Threshold"),
  123|      1|		_("Threshold above which lie percent of pixels"),
  124|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  125|      1|		G_STRUCT_OFFSET(VipsPercent, threshold),
  126|      1|		0, 65535, 0);
  127|      1|}

stdif.c:vips_stdif_class_init:
  282|      1|{
  283|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  284|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  285|       |
  286|      1|	gobject_class->set_property = vips_object_set_property;
  287|      1|	gobject_class->get_property = vips_object_get_property;
  288|       |
  289|      1|	object_class->nickname = "stdif";
  290|      1|	object_class->description = _("statistical difference");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  291|      1|	object_class->build = vips_stdif_build;
  292|       |
  293|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  294|      1|		_("Input"),
  295|      1|		_("Input image"),
  296|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  297|      1|		G_STRUCT_OFFSET(VipsStdif, in));
  298|       |
  299|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  300|      1|		_("Output"),
  301|      1|		_("Output image"),
  302|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  303|      1|		G_STRUCT_OFFSET(VipsStdif, out));
  304|       |
  305|       |	/* Windows larger than 256x256 will overflow sum2, see above.
  306|       |	 */
  307|      1|	VIPS_ARG_INT(class, "width", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  308|      1|		_("Width"),
  309|      1|		_("Window width in pixels"),
  310|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  311|      1|		G_STRUCT_OFFSET(VipsStdif, width),
  312|      1|		1, 256, 11);
  313|       |
  314|      1|	VIPS_ARG_INT(class, "height", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  315|      1|		_("Height"),
  316|      1|		_("Window height in pixels"),
  317|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  318|      1|		G_STRUCT_OFFSET(VipsStdif, height),
  319|      1|		1, 256, 11);
  320|       |
  321|      1|	VIPS_ARG_DOUBLE(class, "a", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  322|      1|		_("Mean weight"),
  323|      1|		_("Weight of new mean"),
  324|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  325|      1|		G_STRUCT_OFFSET(VipsStdif, a),
  326|      1|		0.0, 1.0, 0.5);
  327|       |
  328|      1|	VIPS_ARG_DOUBLE(class, "m0", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  329|      1|		_("Mean"),
  330|      1|		_("New mean"),
  331|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  332|      1|		G_STRUCT_OFFSET(VipsStdif, m0),
  333|      1|		-INFINITY, INFINITY, 128);
  334|       |
  335|      1|	VIPS_ARG_DOUBLE(class, "b", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  336|      1|		_("Deviation weight"),
  337|      1|		_("Weight of new deviation"),
  338|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  339|      1|		G_STRUCT_OFFSET(VipsStdif, b),
  340|      1|		0.0, 2.0, 0.5);
  341|       |
  342|      1|	VIPS_ARG_DOUBLE(class, "s0", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  343|      1|		_("Deviation"),
  344|      1|		_("New deviation"),
  345|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  346|      1|		G_STRUCT_OFFSET(VipsStdif, s0),
  347|      1|		-INFINITY, INFINITY, 50);
  348|      1|}

vips_buf_rewind:
   96|  6.36k|{
   97|  6.36k|	buf->i = 0;
   98|  6.36k|	buf->lasti = 0;
   99|  6.36k|	buf->full = FALSE;
  ------------------
  |  |  794|  6.36k|#define	FALSE	(0)
  ------------------
  100|       |
  101|  6.36k|	if (buf->base)
  ------------------
  |  Branch (101:6): [True: 6.36k, False: 0]
  ------------------
  102|  6.36k|		buf->base[0] = '\0';
  103|  6.36k|}
vips_buf_appendns:
  257|  1.48M|{
  258|  1.48M|	int len;
  259|  1.48M|	int n;
  260|  1.48M|	int avail;
  261|  1.48M|	int cpy;
  262|       |
  263|  1.48M|	if (buf->full)
  ------------------
  |  Branch (263:6): [True: 1.32M, False: 157k]
  ------------------
  264|  1.32M|		return FALSE;
  ------------------
  |  |  794|  1.32M|#define	FALSE	(0)
  ------------------
  265|   157k|	if (!str)
  ------------------
  |  Branch (265:6): [True: 0, False: 157k]
  ------------------
  266|      0|		return TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  267|       |
  268|       |	/* Amount we want to copy.
  269|       |	 */
  270|   157k|	len = strlen(str);
  271|   157k|	if (sz >= 0)
  ------------------
  |  Branch (271:6): [True: 0, False: 157k]
  ------------------
  272|      0|		n = VIPS_MIN(sz, len);
  ------------------
  |  |   55|      0|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  273|   157k|	else
  274|   157k|		n = len;
  275|       |
  276|       |	/* Space available.
  277|       |	 */
  278|   157k|	avail = buf->mx - buf->i - 4;
  279|       |
  280|   157k|	cpy = VIPS_MIN(n, avail);
  ------------------
  |  |   55|   157k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 157k, False: 888]
  |  |  ------------------
  ------------------
  281|       |
  282|       |	/* Can't use g_strlcpy() here, we don't want to drop the end of the
  283|       |	 * string.
  284|       |	 *
  285|       |	 * gcc10.3 (I think?) issues a false-positive warning about this.
  286|       |	 */
  287|   157k|	strncpy(buf->base + buf->i, str, cpy);
  288|   157k|	buf->i += cpy;
  289|       |
  290|   157k|	if (buf->i >= buf->mx - 4) {
  ------------------
  |  Branch (290:6): [True: 888, False: 157k]
  ------------------
  291|    888|		buf->full = TRUE;
  ------------------
  |  |  798|    888|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    888|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  292|    888|		strcpy(buf->base + buf->mx - 4, "...");
  293|    888|		buf->i = buf->mx - 1;
  294|    888|		return FALSE;
  ------------------
  |  |  794|    888|#define	FALSE	(0)
  ------------------
  295|    888|	}
  296|       |
  297|   157k|	return TRUE;
  ------------------
  |  |  798|   157k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   157k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  298|   157k|}
vips_buf_appends:
  311|  1.48M|{
  312|  1.48M|	return vips_buf_appendns(buf, str, -1);
  313|  1.48M|}
vips_buf_vappendf:
  413|  3.12M|{
  414|  3.12M|	int avail;
  415|  3.12M|	char *p;
  416|       |
  417|  3.12M|	if (buf->full)
  ------------------
  |  Branch (417:6): [True: 2.65M, False: 468k]
  ------------------
  418|  2.65M|		return FALSE;
  ------------------
  |  |  794|  2.65M|#define	FALSE	(0)
  ------------------
  419|       |
  420|   468k|	avail = buf->mx - buf->i - 4;
  421|   468k|	p = buf->base + buf->i;
  422|   468k|	(void) g_vsnprintf(p, avail, fmt, ap);
  423|   468k|	buf->i += strlen(p);
  424|       |
  425|   468k|	if (buf->i >= buf->mx - 4) {
  ------------------
  |  Branch (425:6): [True: 0, False: 468k]
  ------------------
  426|      0|		buf->full = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  427|      0|		strcpy(buf->base + buf->mx - 4, "...");
  428|      0|		buf->i = buf->mx - 1;
  429|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  430|      0|	}
  431|       |
  432|   468k|	return TRUE;
  ------------------
  |  |  798|   468k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   468k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  433|   468k|}
vips_buf_appendf:
  447|  1.63M|{
  448|  1.63M|	va_list ap;
  449|  1.63M|	gboolean result;
  450|       |
  451|  1.63M|	va_start(ap, fmt);
  452|  1.63M|	result = vips_buf_vappendf(buf, fmt, ap);
  453|  1.63M|	va_end(ap);
  454|       |
  455|  1.63M|	return result;
  456|  1.63M|}
vips_buf_all:
  724|   158k|{
  725|   158k|	buf->base[buf->i] = '\0';
  726|       |
  727|   158k|	return buf->base;
  728|   158k|}

vips_buffer_done:
  368|  73.4k|{
  369|  73.4k|	VipsImage *im = buffer->im;
  370|  73.4k|	VipsBufferCache *cache;
  371|       |
  372|  73.4k|	if (!buffer->done &&
  ------------------
  |  Branch (372:6): [True: 73.4k, False: 0]
  ------------------
  373|  73.4k|		(cache = buffer_cache_get(im))) {
  ------------------
  |  Branch (373:3): [True: 73.4k, False: 0]
  ------------------
  374|  73.4k|		g_assert(!g_slist_find(cache->buffers, buffer));
  ------------------
  |  |  166|  73.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  73.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  73.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  375|  73.4k|		g_assert(!buffer->cache);
  ------------------
  |  |  166|  73.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  73.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  73.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  376|       |
  377|  73.4k|		buffer->done = TRUE;
  ------------------
  |  |  798|  73.4k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  73.4k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  378|  73.4k|		buffer->cache = cache;
  379|       |
  380|  73.4k|		cache->buffers = g_slist_prepend(cache->buffers, buffer);
  381|       |
  382|       |#ifdef DEBUG_VERBOSE
  383|       |		printf("vips_buffer_done: thread %p adding buffer %p to cache %p\n",
  384|       |			g_thread_self(), buffer, cache);
  385|       |		vips_buffer_print(buffer);
  386|       |#endif /*DEBUG_VERBOSE*/
  387|  73.4k|	}
  388|  73.4k|}
vips_buffer_undone:
  394|   749k|{
  395|   749k|	if (buffer->done) {
  ------------------
  |  Branch (395:6): [True: 73.4k, False: 675k]
  ------------------
  396|  73.4k|		VipsBufferCache *cache = buffer->cache;
  397|       |
  398|       |#ifdef DEBUG_VERBOSE
  399|       |		printf("vips_buffer_undone: thread %p removing "
  400|       |			   "buffer %p from cache %p\n",
  401|       |			g_thread_self(), buffer, cache);
  402|       |#endif /*DEBUG_VERBOSE*/
  403|       |
  404|  73.4k|		g_assert(cache->thread == g_thread_self());
  ------------------
  |  |  166|  73.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  73.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  73.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  405|  73.4k|		g_assert(cache->buffer_thread->thread == cache->thread);
  ------------------
  |  |  166|  73.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  73.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  73.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  406|  73.4k|		g_assert(g_slist_find(cache->buffers, buffer));
  ------------------
  |  |  166|  73.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  73.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  73.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  407|  73.4k|		g_assert(buffer_thread_get());
  ------------------
  |  |  166|  73.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  73.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  73.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  408|  73.4k|		g_assert(cache->buffer_thread == buffer_thread_get());
  ------------------
  |  |  166|  73.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  73.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  73.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  409|       |
  410|  73.4k|		cache->buffers = g_slist_remove(cache->buffers, buffer);
  411|  73.4k|		buffer->done = FALSE;
  ------------------
  |  |  794|  73.4k|#define	FALSE	(0)
  ------------------
  412|       |
  413|       |#ifdef DEBUG_VERBOSE
  414|       |		printf("vips_buffer_undone: %d buffers left\n",
  415|       |			g_slist_length(cache->buffers));
  416|       |#endif /*DEBUG_VERBOSE*/
  417|  73.4k|	}
  418|       |
  419|   749k|	buffer->cache = NULL;
  420|   749k|	buffer->area.width = 0;
  421|   749k|	buffer->area.height = 0;
  422|   749k|}
vips_buffer_unref:
  426|   355k|{
  427|       |#ifdef DEBUG_VERBOSE
  428|       |	printf("** vips_buffer_unref: left = %d, top = %d, "
  429|       |		   "width = %d, height = %d (%p)\n",
  430|       |		buffer->area.left, buffer->area.top,
  431|       |		buffer->area.width, buffer->area.height,
  432|       |		buffer);
  433|       |#endif /*DEBUG_VERBOSE*/
  434|       |
  435|   355k|	g_assert(buffer->ref_count > 0);
  ------------------
  |  |  166|   355k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   355k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   355k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  436|       |
  437|   355k|	buffer->ref_count -= 1;
  438|       |
  439|   355k|	if (buffer->ref_count == 0) {
  ------------------
  |  Branch (439:6): [True: 352k, False: 2.95k]
  ------------------
  440|   352k|		VipsBufferCache *cache;
  441|       |
  442|       |#ifdef DEBUG_VERBOSE
  443|       |		if (!buffer->done)
  444|       |			printf("vips_buffer_unref: buffer was not done\n");
  445|       |#endif /*DEBUG_VERBOSE*/
  446|       |
  447|   352k|		vips_buffer_undone(buffer);
  448|       |
  449|       |		/* Place on this thread's reserve list for reuse.
  450|       |		 */
  451|   352k|		if ((cache = buffer_cache_get(buffer->im)) &&
  ------------------
  |  Branch (451:7): [True: 321k, False: 31.6k]
  ------------------
  452|   352k|			cache->n_reserve < buffer_cache_max_reserve) {
  ------------------
  |  Branch (452:4): [True: 249k, False: 72.1k]
  ------------------
  453|   249k|			g_assert(!buffer->cache);
  ------------------
  |  |  166|   249k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   249k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   249k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  454|       |
  455|   249k|			cache->reserve =
  456|   249k|				g_slist_prepend(cache->reserve, buffer);
  457|   249k|			cache->n_reserve += 1;
  458|       |
  459|   249k|			buffer->cache = cache;
  460|   249k|			buffer->area.width = 0;
  461|   249k|			buffer->area.height = 0;
  462|   249k|		}
  463|   103k|		else
  464|   103k|			vips_buffer_free(buffer);
  465|   352k|	}
  466|   355k|}
vips_buffer_new:
  512|   352k|{
  513|   352k|	VipsBufferCache *cache;
  514|   352k|	VipsBuffer *buffer;
  515|       |
  516|   352k|	if ((cache = buffer_cache_get(im)) &&
  ------------------
  |  Branch (516:6): [True: 341k, False: 10.9k]
  ------------------
  517|   352k|		cache->reserve) {
  ------------------
  |  Branch (517:3): [True: 89.0k, False: 252k]
  ------------------
  518|  89.0k|		buffer = (VipsBuffer *) cache->reserve->data;
  519|  89.0k|		cache->reserve = g_slist_remove(cache->reserve, buffer);
  520|  89.0k|		cache->n_reserve -= 1;
  521|       |
  522|  89.0k|		g_assert(buffer->im == im);
  ------------------
  |  |  166|  89.0k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  89.0k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  89.0k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  523|  89.0k|		g_assert(buffer->done == FALSE);
  ------------------
  |  |  166|  89.0k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  89.0k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  89.0k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  524|  89.0k|		g_assert(buffer->cache);
  ------------------
  |  |  166|  89.0k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  89.0k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  89.0k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  525|       |
  526|  89.0k|		buffer->ref_count = 1;
  527|  89.0k|		buffer->done = FALSE;
  ------------------
  |  |  794|  89.0k|#define	FALSE	(0)
  ------------------
  528|  89.0k|		buffer->cache = NULL;
  529|  89.0k|	}
  530|   263k|	else {
  531|   263k|		buffer = g_new0(VipsBuffer, 1);
  ------------------
  |  |  299|   263k|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|   263k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   263k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   263k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   263k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   263k|	  gpointer __p;						\
  |  |  |  |  231|   263k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 263k]
  |  |  |  |  ------------------
  |  |  |  |  232|   263k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   263k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 263k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|   263k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 263k]
  |  |  |  |  |  Branch (234:26): [True: 263k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   263k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   263k|	  else							\
  |  |  |  |  237|   263k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   263k|	  __p;							\
  |  |  |  |  239|   263k|	}))
  |  |  ------------------
  ------------------
  532|   263k|		buffer->ref_count = 1;
  533|   263k|		buffer->im = im;
  534|   263k|		buffer->done = FALSE;
  ------------------
  |  |  794|   263k|#define	FALSE	(0)
  ------------------
  535|   263k|		buffer->cache = NULL;
  536|   263k|		buffer->buf = NULL;
  537|   263k|		buffer->bsize = 0;
  538|       |
  539|       |#ifdef DEBUG
  540|       |		g_mutex_lock(&vips__global_lock);
  541|       |		vips__buffer_all =
  542|       |			g_slist_prepend(vips__buffer_all, buffer);
  543|       |		g_mutex_unlock(&vips__global_lock);
  544|       |#endif /*DEBUG*/
  545|   263k|	}
  546|       |
  547|   352k|	if (buffer_move(buffer, area)) {
  ------------------
  |  Branch (547:6): [True: 0, False: 352k]
  ------------------
  548|      0|		vips_buffer_free(buffer);
  549|      0|		return NULL;
  550|      0|	}
  551|       |
  552|   352k|	return buffer;
  553|   352k|}
vips_buffer_unref_ref:
  621|   388k|{
  622|   388k|	VipsBuffer *buffer;
  623|       |
  624|   388k|	g_assert(!old_buffer ||
  ------------------
  |  |  166|   388k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   388k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   388k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  625|   388k|		old_buffer->im == im);
  626|       |
  627|       |	/* Is the current buffer OK?
  628|       |	 */
  629|   388k|	if (old_buffer &&
  ------------------
  |  Branch (629:6): [True: 34.4k, False: 354k]
  ------------------
  630|   388k|		vips_rect_includesrect(&old_buffer->area, area))
  ------------------
  |  Branch (630:3): [True: 0, False: 34.4k]
  ------------------
  631|      0|		return old_buffer;
  632|       |
  633|       |	/* Does the new area already have a buffer?
  634|       |	 */
  635|   388k|	if ((buffer = buffer_find(im, area))) {
  ------------------
  |  Branch (635:6): [True: 2.95k, False: 385k]
  ------------------
  636|  2.95k|		VIPS_FREEF(vips_buffer_unref, old_buffer);
  ------------------
  |  |   41|  2.95k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.95k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.95k|	{ \
  |  |   43|  2.95k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 950, False: 2.00k]
  |  |  ------------------
  |  |   44|    950|			(void) F((S)); \
  |  |   45|    950|			(S) = 0; \
  |  |   46|    950|		} \
  |  |   47|  2.95k|	} \
  |  |   48|  2.95k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.95k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  637|  2.95k|		return buffer;
  638|  2.95k|	}
  639|       |
  640|       |	/* Is the current buffer unshared? We can just move it.
  641|       |	 */
  642|   385k|	if (old_buffer &&
  ------------------
  |  Branch (642:6): [True: 33.4k, False: 352k]
  ------------------
  643|   385k|		old_buffer->ref_count == 1) {
  ------------------
  |  Branch (643:3): [True: 32.9k, False: 515]
  ------------------
  644|  32.9k|		if (buffer_move(old_buffer, area)) {
  ------------------
  |  Branch (644:7): [True: 0, False: 32.9k]
  ------------------
  645|      0|			vips_buffer_unref(old_buffer);
  646|      0|			return NULL;
  647|      0|		}
  648|       |
  649|  32.9k|		return old_buffer;
  650|  32.9k|	}
  651|       |
  652|       |	/* Fallback ... unref the old one, make a new one.
  653|       |	 */
  654|   385k|	VIPS_FREEF(vips_buffer_unref, old_buffer);
  ------------------
  |  |   41|   352k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   352k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   352k|	{ \
  |  |   43|   352k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 515, False: 352k]
  |  |  ------------------
  |  |   44|    515|			(void) F((S)); \
  |  |   45|    515|			(S) = 0; \
  |  |   46|    515|		} \
  |  |   47|   352k|	} \
  |  |   48|   385k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   385k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  655|   352k|	if (!(buffer = vips_buffer_new(im, area)))
  ------------------
  |  Branch (655:6): [True: 0, False: 352k]
  ------------------
  656|      0|		return NULL;
  657|       |
  658|   352k|	return buffer;
  659|   352k|}
vips__buffer_init:
  677|      2|{
  678|      2|	if (buffer_cache_max_reserve < 1)
  ------------------
  |  Branch (678:6): [Folded - Ignored]
  ------------------
  679|      0|		printf("vips__buffer_init: buffer reserve disabled\n");
  680|       |
  681|       |#ifdef DEBUG
  682|       |	printf("vips__buffer_init: DEBUG enabled\n");
  683|       |#endif /*DEBUG*/
  684|       |
  685|       |#ifdef DEBUG_CREATE
  686|       |	printf("vips__buffer_init: DEBUG_CREATE enabled\n");
  687|       |#endif /*DEBUG_CREATE*/
  688|      2|}
vips__buffer_shutdown:
  692|  50.2k|{
  693|  50.2k|	VipsBufferThread *buffer_thread;
  694|       |
  695|  50.2k|	if ((buffer_thread = g_private_get(&buffer_thread_key))) {
  ------------------
  |  Branch (695:6): [True: 28.4k, False: 21.8k]
  ------------------
  696|  28.4k|		buffer_thread_free(buffer_thread);
  697|  28.4k|		g_private_set(&buffer_thread_key, NULL);
  698|  28.4k|	}
  699|  50.2k|}
buffer.c:buffer_cache_get:
  345|  1.16M|{
  346|  1.16M|	VipsBufferThread *buffer_thread;
  347|  1.16M|	VipsBufferCache *cache;
  348|       |
  349|  1.16M|	if ((buffer_thread = buffer_thread_get())) {
  ------------------
  |  Branch (349:6): [True: 1.11M, False: 53.4k]
  ------------------
  350|  1.11M|		if (!(cache = (VipsBufferCache *)
  ------------------
  |  Branch (350:7): [True: 163k, False: 950k]
  ------------------
  351|  1.11M|					g_hash_table_lookup(buffer_thread->hash, im))) {
  352|   163k|			cache = buffer_cache_new(buffer_thread, im);
  353|   163k|			g_hash_table_insert(buffer_thread->hash, im, cache);
  354|   163k|		}
  355|       |
  356|  1.11M|		g_assert(cache->thread == g_thread_self());
  ------------------
  |  |  166|  1.11M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.11M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  357|  1.11M|	}
  358|  53.4k|	else
  359|  53.4k|		cache = NULL;
  360|       |
  361|  1.16M|	return cache;
  362|  1.16M|}
buffer.c:buffer_thread_get:
  318|  1.16M|{
  319|  1.16M|	VipsBufferThread *buffer_thread;
  320|       |
  321|  1.16M|	if (vips_thread_isvips()) {
  ------------------
  |  Branch (321:6): [True: 1.11M, False: 53.4k]
  ------------------
  322|       |		/* Our threads get a set of private buffers, since we know we
  323|       |		 * will be calling vips_thread_shutdown() on thread
  324|       |		 * termination.
  325|       |		 */
  326|  1.11M|		if (!(buffer_thread = g_private_get(&buffer_thread_key))) {
  ------------------
  |  Branch (326:7): [True: 28.4k, False: 1.08M]
  ------------------
  327|  28.4k|			buffer_thread = buffer_thread_new();
  328|  28.4k|			g_private_set(&buffer_thread_key, buffer_thread);
  329|  28.4k|		}
  330|       |
  331|  1.11M|		g_assert(buffer_thread->thread == g_thread_self());
  ------------------
  |  |  166|  1.11M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.11M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|  1.11M|	}
  333|  53.4k|	else
  334|       |		/* Non-vips threads don't have one.
  335|       |		 */
  336|  53.4k|		buffer_thread = NULL;
  337|       |
  338|  1.16M|	return buffer_thread;
  339|  1.16M|}
buffer.c:buffer_thread_new:
  302|  28.4k|{
  303|  28.4k|	VipsBufferThread *buffer_thread;
  304|       |
  305|  28.4k|	buffer_thread = g_new(VipsBufferThread, 1);
  ------------------
  |  |  282|  28.4k|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  28.4k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  28.4k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  28.4k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  28.4k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  28.4k|	  gpointer __p;						\
  |  |  |  |  231|  28.4k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 28.4k]
  |  |  |  |  ------------------
  |  |  |  |  232|  28.4k|	    __p = g_##func (__n);				\
  |  |  |  |  233|  28.4k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 28.4k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  28.4k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 28.4k]
  |  |  |  |  |  Branch (234:26): [True: 28.4k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  28.4k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  28.4k|	  else							\
  |  |  |  |  237|  28.4k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  28.4k|	  __p;							\
  |  |  |  |  239|  28.4k|	}))
  |  |  ------------------
  ------------------
  306|  28.4k|	buffer_thread->hash = g_hash_table_new_full(
  307|  28.4k|		g_direct_hash, g_direct_equal,
  308|  28.4k|		NULL, (GDestroyNotify) buffer_cache_free);
  309|  28.4k|	buffer_thread->thread = g_thread_self();
  310|       |
  311|  28.4k|	return buffer_thread;
  312|  28.4k|}
buffer.c:buffer_cache_free:
  233|   163k|{
  234|   163k|	GSList *p;
  235|       |
  236|       |#ifdef DEBUG_CREATE
  237|       |	g_mutex_lock(&vips__global_lock);
  238|       |	vips__buffer_cache_all =
  239|       |		g_slist_remove(vips__buffer_cache_all, cache);
  240|       |	g_mutex_unlock(&vips__global_lock);
  241|       |
  242|       |	printf("buffer_cache_free: freeing cache %p on thread %p\n",
  243|       |		cache, g_thread_self());
  244|       |	printf("\t(%d caches left)\n",
  245|       |		g_slist_length(vips__buffer_cache_all));
  246|       |#endif /*DEBUG_CREATE*/
  247|       |
  248|       |	/* Need to mark undone so we don't try and take them off this cache on
  249|       |	 * unref.
  250|       |	 */
  251|   163k|	for (p = cache->buffers; p; p = p->next) {
  ------------------
  |  Branch (251:27): [True: 0, False: 163k]
  ------------------
  252|      0|		VipsBuffer *buffer = (VipsBuffer *) p->data;
  253|       |
  254|      0|		g_assert(buffer->done);
  ------------------
  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  255|      0|		g_assert(buffer->cache == cache);
  ------------------
  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|       |
  257|      0|		buffer->done = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  258|      0|		buffer->cache = NULL;
  259|      0|	}
  260|   163k|	VIPS_FREEF(g_slist_free, cache->buffers);
  ------------------
  |  |   41|   163k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   163k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   163k|	{ \
  |  |   43|   163k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 163k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|   163k|	} \
  |  |   48|   163k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   163k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  261|       |
  262|   323k|	for (p = cache->reserve; p; p = p->next) {
  ------------------
  |  Branch (262:27): [True: 159k, False: 163k]
  ------------------
  263|   159k|		VipsBuffer *buffer = (VipsBuffer *) p->data;
  264|       |
  265|   159k|		vips_buffer_free(buffer);
  266|   159k|	}
  267|   163k|	VIPS_FREEF(g_slist_free, cache->reserve);
  ------------------
  |  |   41|   163k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   163k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   163k|	{ \
  |  |   43|   163k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 154k, False: 9.58k]
  |  |  ------------------
  |  |   44|   154k|			(void) F((S)); \
  |  |   45|   154k|			(S) = 0; \
  |  |   46|   154k|		} \
  |  |   47|   163k|	} \
  |  |   48|   163k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   163k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  268|       |
  269|   163k|	g_free(cache);
  270|   163k|}
buffer.c:buffer_cache_new:
  274|   163k|{
  275|   163k|	VipsBufferCache *cache;
  276|       |
  277|   163k|	cache = g_new(VipsBufferCache, 1);
  ------------------
  |  |  282|   163k|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|   163k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   163k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   163k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   163k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   163k|	  gpointer __p;						\
  |  |  |  |  231|   163k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 163k]
  |  |  |  |  ------------------
  |  |  |  |  232|   163k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   163k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 163k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|   163k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 163k]
  |  |  |  |  |  Branch (234:26): [True: 163k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   163k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   163k|	  else							\
  |  |  |  |  237|   163k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   163k|	  __p;							\
  |  |  |  |  239|   163k|	}))
  |  |  ------------------
  ------------------
  278|   163k|	cache->buffers = NULL;
  279|   163k|	cache->thread = g_thread_self();
  280|   163k|	cache->im = im;
  281|   163k|	cache->buffer_thread = buffer_thread;
  282|   163k|	cache->reserve = NULL;
  283|   163k|	cache->n_reserve = 0;
  284|       |
  285|       |#ifdef DEBUG_CREATE
  286|       |	g_mutex_lock(&vips__global_lock);
  287|       |	vips__buffer_cache_all =
  288|       |		g_slist_prepend(vips__buffer_cache_all, cache);
  289|       |	g_mutex_unlock(&vips__global_lock);
  290|       |
  291|       |	printf("buffer_cache_new: new cache %p for thread %p on image %p\n",
  292|       |		cache, g_thread_self(), im);
  293|       |	printf("\t(%d caches now)\n",
  294|       |		g_slist_length(vips__buffer_cache_all));
  295|       |#endif /*DEBUG_CREATE*/
  296|       |
  297|   163k|	return cache;
  298|   163k|}
buffer.c:vips_buffer_free:
  203|   263k|{
  204|   263k|	VIPS_FREEF(vips_tracked_aligned_free, buffer->buf);
  ------------------
  |  |   41|   263k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   263k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   263k|	{ \
  |  |   43|   263k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 263k, False: 0]
  |  |  ------------------
  |  |   44|   263k|			(void) F((S)); \
  |  |   45|   263k|			(S) = 0; \
  |  |   46|   263k|		} \
  |  |   47|   263k|	} \
  |  |   48|   263k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   263k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|   263k|	buffer->bsize = 0;
  206|   263k|	g_free(buffer);
  207|       |
  208|       |#ifdef DEBUG
  209|       |	g_mutex_lock(&vips__global_lock);
  210|       |
  211|       |	g_assert(g_slist_find(vips__buffer_all, buffer));
  212|       |	vips__buffer_all = g_slist_remove(vips__buffer_all, buffer);
  213|       |
  214|       |	g_mutex_unlock(&vips__global_lock);
  215|       |#endif /*DEBUG*/
  216|       |
  217|       |#ifdef DEBUG_VERBOSE
  218|       |	printf("vips_buffer_free: freeing buffer %p\n", buffer);
  219|       |#endif /*DEBUG_VERBOSE*/
  220|   263k|}
buffer.c:buffer_move:
  470|   385k|{
  471|   385k|	VipsImage *im = buffer->im;
  472|   385k|	size_t new_bsize;
  473|   385k|	size_t align;
  474|       |
  475|   385k|	g_assert(buffer->ref_count == 1);
  ------------------
  |  |  166|   385k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   385k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   385k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  476|       |
  477|   385k|	vips_buffer_undone(buffer);
  478|   385k|	g_assert(!buffer->done);
  ------------------
  |  |  166|   385k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   385k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   385k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  479|       |
  480|   385k|	buffer->area = *area;
  481|       |
  482|   385k|	new_bsize = (size_t) VIPS_IMAGE_SIZEOF_PEL(im) *
  ------------------
  |  |  384|   385k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   385k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  483|   385k|		area->width * area->height;
  484|       |
  485|       |	/* Need to pad buffer size to be aligned-up to
  486|       |	 * 64 bytes for the vips_reduce{h,v} highway path.
  487|       |	 */
  488|   385k|#ifdef HAVE_HWY
  489|   385k|	if (im->BandFmt == VIPS_FORMAT_UCHAR) {
  ------------------
  |  Branch (489:6): [True: 310k, False: 75.1k]
  ------------------
  490|   310k|		new_bsize += /*HWY_ALIGNMENT*/ 64 - 1;
  491|   310k|		align = /*HWY_ALIGNMENT*/ 64;
  492|   310k|	}
  493|  75.1k|	else
  494|  75.1k|#endif /*HAVE_HWY*/
  495|  75.1k|		align = 16;
  496|       |
  497|   385k|	if (buffer->bsize < new_bsize ||
  ------------------
  |  Branch (497:6): [True: 263k, False: 122k]
  ------------------
  498|   385k|		!buffer->buf) {
  ------------------
  |  Branch (498:3): [True: 0, False: 122k]
  ------------------
  499|   263k|		buffer->bsize = new_bsize;
  500|   263k|		VIPS_FREEF(vips_tracked_aligned_free, buffer->buf);
  ------------------
  |  |   41|   263k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   263k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   263k|	{ \
  |  |   43|   263k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 263k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|   263k|	} \
  |  |   48|   263k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   263k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  501|   263k|		if (!(buffer->buf = vips_tracked_aligned_alloc(buffer->bsize, align)))
  ------------------
  |  Branch (501:7): [True: 0, False: 263k]
  ------------------
  502|      0|			return -1;
  503|   263k|	}
  504|       |
  505|   385k|	return 0;
  506|   385k|}
buffer.c:buffer_find:
  560|   388k|{
  561|   388k|	VipsBufferCache *cache;
  562|   388k|	VipsBuffer *buffer;
  563|   388k|	GSList *p;
  564|   388k|	VipsRect *area;
  565|       |
  566|   388k|	if (!(cache = buffer_cache_get(im)))
  ------------------
  |  Branch (566:6): [True: 10.9k, False: 377k]
  ------------------
  567|  10.9k|		return NULL;
  568|       |
  569|       |	/* This needs to be quick :-( don't use
  570|       |	 * vips_slist_map2()/vips_rect_includesrect(), do the search
  571|       |	 * inline.
  572|       |	 *
  573|       |	 * FIXME we return the first enclosing buffer, perhaps we should
  574|       |	 * search for the largest?
  575|       |	 */
  576|   411k|	for (p = cache->buffers; p; p = p->next) {
  ------------------
  |  Branch (576:27): [True: 36.4k, False: 374k]
  ------------------
  577|  36.4k|		buffer = (VipsBuffer *) p->data;
  578|  36.4k|		area = &buffer->area;
  579|       |
  580|  36.4k|		if (area->left <= r->left &&
  ------------------
  |  Branch (580:7): [True: 36.4k, False: 0]
  ------------------
  581|  36.4k|			area->top <= r->top &&
  ------------------
  |  Branch (581:4): [True: 36.4k, False: 0]
  ------------------
  582|  36.4k|			area->left + area->width >= r->left + r->width &&
  ------------------
  |  Branch (582:4): [True: 36.4k, False: 0]
  ------------------
  583|  36.4k|			area->top + area->height >= r->top + r->height) {
  ------------------
  |  Branch (583:4): [True: 2.95k, False: 33.4k]
  ------------------
  584|  2.95k|			buffer->ref_count += 1;
  585|       |
  586|       |#ifdef DEBUG_VERBOSE
  587|       |			printf("buffer_find: left = %d, top = %d, "
  588|       |				   "width = %d, height = %d, count = %d (%p)\n",
  589|       |				buffer->area.left, buffer->area.top,
  590|       |				buffer->area.width, buffer->area.height,
  591|       |				buffer->ref_count,
  592|       |				buffer);
  593|       |#endif /*DEBUG_VERBOSE*/
  594|       |
  595|  2.95k|			return buffer;
  596|  2.95k|		}
  597|  36.4k|	}
  598|       |
  599|   374k|	return NULL;
  600|   377k|}
buffer.c:buffer_thread_free:
  224|  28.4k|{
  225|  28.4k|	VIPS_FREEF(g_hash_table_destroy, buffer_thread->hash);
  ------------------
  |  |   41|  28.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  28.4k|	{ \
  |  |   43|  28.4k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 28.4k, False: 0]
  |  |  ------------------
  |  |   44|  28.4k|			(void) F((S)); \
  |  |   45|  28.4k|			(S) = 0; \
  |  |   46|  28.4k|		} \
  |  |   47|  28.4k|	} \
  |  |   48|  28.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  226|  28.4k|	VIPS_FREE(buffer_thread);
  ------------------
  |  |   50|  28.4k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  28.4k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  28.4k|	{ \
  |  |  |  |   43|  28.4k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 28.4k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  28.4k|			(void) F((S)); \
  |  |  |  |   45|  28.4k|			(S) = 0; \
  |  |  |  |   46|  28.4k|		} \
  |  |  |  |   47|  28.4k|	} \
  |  |  |  |   48|  28.4k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  227|  28.4k|}

vips_operation_hash:
  342|   844k|{
  343|   844k|	guint hash;
  344|       |
  345|   844k|	if (operation->found_hash)
  ------------------
  |  Branch (345:6): [True: 511k, False: 333k]
  ------------------
  346|   511k|		hash = operation->hash;
  347|   333k|	else {
  348|       |		/* Include the operation type in the hash.
  349|       |		 */
  350|   333k|		hash = (guint) G_OBJECT_TYPE(operation);
  ------------------
  |  |   95|   333k|#define G_OBJECT_TYPE(object)       (G_TYPE_FROM_INSTANCE (object))
  |  |  ------------------
  |  |  |  |  602|   333k|#define G_TYPE_FROM_INSTANCE(instance)                          (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|   333k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  351|   333k|		(void) vips_argument_map(VIPS_OBJECT(operation),
  ------------------
  |  |  433|   333k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   333k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   333k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  352|   333k|			vips_object_hash_arg, &hash, NULL);
  353|       |
  354|       |		/* Make sure we can't have a zero hash value.
  355|       |		 */
  356|   333k|		hash |= 1;
  357|       |
  358|       |		/* The hash can change up to the moment of construction. After that,
  359|       |		 * it should be fixed.
  360|       |		 */
  361|   333k|		if (VIPS_OBJECT(operation)->constructed) {
  ------------------
  |  |  433|   333k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   333k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   333k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (361:7): [True: 152k, False: 181k]
  ------------------
  362|   152k|			operation->hash = hash;
  363|   152k|			operation->found_hash = TRUE;
  ------------------
  |  |  798|   152k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   152k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  364|   152k|		}
  365|   333k|	}
  366|       |
  367|   844k|	return hash;
  368|   844k|}
vips__cache_once_init:
  473|      2|{
  474|      2|	vips_cache_table = g_hash_table_new(
  475|      2|		(GHashFunc) vips_operation_hash,
  476|      2|		(GEqualFunc) vips_operation_equal);
  477|       |
  478|      2|	return NULL;
  479|      2|}
vips__cache_init:
  483|      2|{
  484|      2|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|      2|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
  485|       |
  486|      2|	VIPS_ONCE(&once, vips__cache_once_init, NULL);
  ------------------
  |  |   93|      2|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      2|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|      2|	{ \
  |  |   95|      2|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|      2|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|      2| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|      2|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|      2|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 2, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|      2|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|      2|   else                                         \
  |  |  |  |  |  |  931|      2|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|      2|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|      2|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 2, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|      2|			(void) g_once(ONCE, FUNC, CLIENT); \
  |  |  ------------------
  |  |  |  |  241|      2|  (((once)->status == G_ONCE_STATUS_READY) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (241:4): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  |  |  242|      2|   (once)->retval : \
  |  |  |  |  243|      2|   g_once_impl ((once), (func), (arg)))
  |  |  ------------------
  |  |   97|      2|	} \
  |  |   98|      2|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      2|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  487|      2|}
vips_cache_operation_buildp:
  884|   171k|{
  885|       |	/* Any flags for this new operation we are building.
  886|       |	 */
  887|   171k|	VipsOperationFlags flags = vips_operation_get_flags(*operation);
  888|       |
  889|   171k|	VipsOperationCacheEntry *hit;
  890|       |
  891|   171k|	g_assert(VIPS_IS_OPERATION(*operation));
  ------------------
  |  |  166|   171k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   171k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   171k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  892|       |
  893|       |#ifdef VIPS_DEBUG
  894|       |	printf("vips_cache_operation_buildp: %p %s\n",
  895|       |		*operation,
  896|       |		VIPS_OBJECT_GET_CLASS(*operation)->nickname);
  897|       |	vips_object_print_dump(VIPS_OBJECT(*operation));
  898|       |#endif /*VIPS_DEBUG*/
  899|       |
  900|   171k|	g_mutex_lock(&vips_cache_lock);
  901|       |
  902|   171k|	hit = vips_cache_operation_get(*operation);
  903|       |
  904|       |	/* We need to remove the existing cache entry if it's been tagged
  905|       |	 * as invalid, if it's been blocked, or someone has requested
  906|       |	 * revalidation.
  907|       |	 */
  908|   171k|	if (hit) {
  ------------------
  |  Branch (908:6): [True: 9.02k, False: 162k]
  ------------------
  909|  9.02k|		if (hit->invalid ||
  ------------------
  |  Branch (909:7): [True: 0, False: 9.02k]
  ------------------
  910|  9.02k|			(flags & VIPS_OPERATION_BLOCKED) ||
  ------------------
  |  Branch (910:4): [True: 0, False: 9.02k]
  ------------------
  911|  9.02k|			(flags & VIPS_OPERATION_REVALIDATE)) {
  ------------------
  |  Branch (911:4): [True: 0, False: 9.02k]
  ------------------
  912|      0|			vips_cache_remove(hit->operation);
  913|      0|			hit = NULL;
  914|      0|		}
  915|  9.02k|	}
  916|       |
  917|       |	/* If we still have a hit, return that and junk the operation we were
  918|       |	 * passed.
  919|       |	 */
  920|   171k|	if (hit) {
  ------------------
  |  Branch (920:6): [True: 9.02k, False: 162k]
  ------------------
  921|  9.02k|		vips_cache_ref(hit->operation);
  922|  9.02k|		g_object_unref(*operation);
  923|  9.02k|		*operation = hit->operation;
  924|       |
  925|  9.02k|		if (vips__cache_trace) {
  ------------------
  |  Branch (925:7): [True: 0, False: 9.02k]
  ------------------
  926|      0|			printf("vips cache*: ");
  927|      0|			vips_object_print_summary(VIPS_OBJECT(*operation));
  ------------------
  |  |  433|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  928|      0|		}
  929|  9.02k|	}
  930|       |
  931|   171k|	g_mutex_unlock(&vips_cache_lock);
  932|       |
  933|       |	/* If there was a miss, we need to build this operation and add
  934|       |	 * it to the cache, if appropriate.
  935|       |	 */
  936|   171k|	if (!hit) {
  ------------------
  |  Branch (936:6): [True: 162k, False: 9.02k]
  ------------------
  937|   162k|		unsigned int hash_before = 0;
  938|   162k|		VipsOperation *operation_before = NULL;
  939|       |
  940|       |		/* The _build method must not change the object hash. If it does, the
  941|       |		 * finished operation won't detect hits with next identical call.
  942|       |		 */
  943|   162k|		if (vips__leak) {
  ------------------
  |  Branch (943:7): [True: 0, False: 162k]
  ------------------
  944|      0|			hash_before = vips_operation_hash(*operation);
  945|      0|			operation_before = vips_operation_copy(*operation);
  946|      0|		}
  947|       |
  948|   162k|		if (vips_object_build(VIPS_OBJECT(*operation)))
  ------------------
  |  |  433|   162k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   162k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   162k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (948:7): [True: 10.1k, False: 152k]
  ------------------
  949|  10.1k|			return -1;
  950|       |
  951|   152k|		if (vips__leak &&
  ------------------
  |  Branch (951:7): [True: 0, False: 152k]
  ------------------
  952|   152k|			!(flags & VIPS_OPERATION_NOCACHE) &&
  ------------------
  |  Branch (952:4): [True: 0, False: 0]
  ------------------
  953|   152k|			hash_before != vips_operation_hash(*operation)) {
  ------------------
  |  Branch (953:4): [True: 0, False: 0]
  ------------------
  954|      0|			const char *name = (const char *)
  955|      0|				vips_argument_map(VIPS_OBJECT(*operation),
  ------------------
  |  |  433|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  956|      0|					vips_object_equal_arg, operation_before, NULL);
  957|      0|			VipsObject *object = VIPS_OBJECT(*operation);
  ------------------
  |  |  433|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  958|      0|			VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|      0|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|      0|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|      0|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  959|       |
  960|      0|			char txt[256];
  961|      0|			VipsBuf buf = VIPS_BUF_STATIC(txt);
  ------------------
  |  |   60|      0|	{ \
  |  |   61|      0|		&TEXT[0], sizeof(TEXT), 0, FALSE, 0, FALSE \
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  |  |               		&TEXT[0], sizeof(TEXT), 0, FALSE, 0, FALSE \
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  |  |   62|      0|	}
  ------------------
  962|       |
  963|      0|			VIPS_UNREF(operation_before);
  ------------------
  |  |   57|      0|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  964|       |
  965|      0|			vips_object_summary_class(class, &buf);
  966|      0|			vips_buf_appends(&buf, ", ");
  967|      0|			vips_object_summary(object, &buf);
  968|      0|			vips_buf_appends(&buf, ", ");
  969|      0|			vips_error(class->nickname, "arg \"%s\" changed during build, %s",
  970|      0|				name, vips_buf_all(&buf));
  971|       |
  972|      0|			return -1;
  973|      0|		}
  974|       |
  975|   152k|		VIPS_UNREF(operation_before);
  ------------------
  |  |   57|   152k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|   152k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   152k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   152k|	{ \
  |  |  |  |   43|   152k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 152k]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|   152k|	} \
  |  |  |  |   48|   152k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   152k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  976|       |
  977|       |		/* Retrieve the flags again, as vips_foreign_load_build() may
  978|       |		 * set load->nocache.
  979|       |		 */
  980|   152k|		flags = vips_operation_get_flags(*operation);
  981|       |
  982|   152k|		g_mutex_lock(&vips_cache_lock);
  983|       |
  984|       |		/* If two threads build the same operation at the same time,
  985|       |		 * we can get multiple adds. Let the first one win. See
  986|       |		 * https://github.com/libvips/libvips/pull/181
  987|       |		 */
  988|   152k|		if (!vips_cache_operation_get(*operation)) {
  ------------------
  |  Branch (988:7): [True: 152k, False: 0]
  ------------------
  989|       |			/* Has to be after _build() so we can see output args.
  990|       |			 */
  991|   152k|			if (vips__cache_trace) {
  ------------------
  |  Branch (991:8): [True: 0, False: 152k]
  ------------------
  992|      0|				if (flags & VIPS_OPERATION_NOCACHE)
  ------------------
  |  Branch (992:9): [True: 0, False: 0]
  ------------------
  993|      0|					printf("vips cache : ");
  994|      0|				else
  995|      0|					printf("vips cache+: ");
  996|      0|				vips_object_print_summary(VIPS_OBJECT(*operation));
  ------------------
  |  |  433|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  997|      0|			}
  998|       |
  999|   152k|			if (!(flags & VIPS_OPERATION_NOCACHE))
  ------------------
  |  Branch (999:8): [True: 90.6k, False: 61.9k]
  ------------------
 1000|  90.6k|				vips_cache_insert(*operation);
 1001|   152k|		}
 1002|       |
 1003|   152k|		g_mutex_unlock(&vips_cache_lock);
 1004|   152k|	}
 1005|       |
 1006|   161k|	vips_cache_trim();
 1007|       |
 1008|   161k|	return 0;
 1009|   171k|}
cache.c:vips_object_hash_arg:
  318|  3.47M|{
  319|  3.47M|	unsigned int *hash = (unsigned int *) a;
  320|       |
  321|  3.47M|	if ((argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (321:6): [True: 2.81M, False: 667k]
  ------------------
  322|  3.47M|		(argument_class->flags & VIPS_ARGUMENT_INPUT) &&
  ------------------
  |  Branch (322:3): [True: 2.46M, False: 344k]
  ------------------
  323|  3.47M|		!(argument_class->flags & VIPS_ARGUMENT_NON_HASHABLE) &&
  ------------------
  |  Branch (323:3): [True: 2.44M, False: 26.2k]
  ------------------
  324|  3.47M|		argument_instance->assigned) {
  ------------------
  |  Branch (324:3): [True: 560k, False: 1.88M]
  ------------------
  325|   560k|		const char *name = g_param_spec_get_name(pspec);
  326|   560k|		GType type = G_PARAM_SPEC_VALUE_TYPE(pspec);
  ------------------
  |  |  103|   560k|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|   560k|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|   560k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|   560k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  327|   560k|		GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|   560k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
  328|       |
  329|   560k|		g_value_init(&value, type);
  330|   560k|		g_object_get_property(G_OBJECT(object), name, &value);
  ------------------
  |  |   51|   560k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|   560k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   560k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  331|   560k|		*hash = (*hash << 1) ^ vips_value_hash(pspec, &value);
  332|   560k|		g_value_unset(&value);
  333|   560k|	}
  334|       |
  335|  3.47M|	return NULL;
  336|  3.47M|}
cache.c:vips_value_hash:
  135|   560k|{
  136|   560k|	GType generic = G_PARAM_SPEC_TYPE(pspec);
  ------------------
  |  |   89|   560k|#define G_PARAM_SPEC_TYPE(pspec)	(G_TYPE_FROM_INSTANCE (pspec))
  |  |  ------------------
  |  |  |  |  602|   560k|#define G_TYPE_FROM_INSTANCE(instance)                          (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|   560k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  137|       |
  138|       |	/* Not compile-time constants, so we have to use a set of if()s. Could
  139|       |	 * make a table at run time I guess.
  140|       |	 */
  141|       |
  142|   560k|	if (generic == G_TYPE_PARAM_BOOLEAN)
  ------------------
  |  |   85|   560k|#define	G_TYPE_PARAM_BOOLEAN		   (g_param_spec_types[2])
  ------------------
  |  Branch (142:6): [True: 3.38k, False: 556k]
  ------------------
  143|  3.38k|		return (unsigned int) g_value_get_boolean(value);
  144|   556k|	else if (generic == G_TYPE_PARAM_CHAR)
  ------------------
  |  |   39|   556k|#define	G_TYPE_PARAM_CHAR		   (g_param_spec_types[0])
  ------------------
  |  Branch (144:11): [True: 0, False: 556k]
  ------------------
  145|      0|		return (unsigned int) g_value_get_schar(value);
  146|   556k|	else if (generic == G_TYPE_PARAM_UCHAR)
  ------------------
  |  |   62|   556k|#define	G_TYPE_PARAM_UCHAR		   (g_param_spec_types[1])
  ------------------
  |  Branch (146:11): [True: 0, False: 556k]
  ------------------
  147|      0|		return (unsigned int) g_value_get_uchar(value);
  148|   556k|	else if (generic == G_TYPE_PARAM_INT)
  ------------------
  |  |  108|   556k|#define	G_TYPE_PARAM_INT		   (g_param_spec_types[3])
  ------------------
  |  Branch (148:11): [True: 99.2k, False: 457k]
  ------------------
  149|  99.2k|		return (unsigned int) g_value_get_int(value);
  150|   457k|	else if (generic == G_TYPE_PARAM_UINT)
  ------------------
  |  |  131|   457k|#define	G_TYPE_PARAM_UINT		   (g_param_spec_types[4])
  ------------------
  |  Branch (150:11): [True: 0, False: 457k]
  ------------------
  151|      0|		return (unsigned int) g_value_get_uint(value);
  152|   457k|	else if (generic == G_TYPE_PARAM_LONG)
  ------------------
  |  |  154|   457k|#define	G_TYPE_PARAM_LONG		   (g_param_spec_types[5])
  ------------------
  |  Branch (152:11): [True: 0, False: 457k]
  ------------------
  153|      0|		return (unsigned int) g_value_get_long(value);
  154|   457k|	else if (generic == G_TYPE_PARAM_ULONG)
  ------------------
  |  |  177|   457k|#define	G_TYPE_PARAM_ULONG		   (g_param_spec_types[6])
  ------------------
  |  Branch (154:11): [True: 0, False: 457k]
  ------------------
  155|      0|		return (unsigned int) g_value_get_ulong(value);
  156|   457k|	else if (generic == G_TYPE_PARAM_ENUM)
  ------------------
  |  |  269|   457k|#define	G_TYPE_PARAM_ENUM		   (g_param_spec_types[10])
  ------------------
  |  Branch (156:11): [True: 71.9k, False: 385k]
  ------------------
  157|  71.9k|		return (unsigned int) g_value_get_enum(value);
  158|   385k|	else if (generic == G_TYPE_PARAM_FLAGS)
  ------------------
  |  |  292|   385k|#define	G_TYPE_PARAM_FLAGS		   (g_param_spec_types[11])
  ------------------
  |  Branch (158:11): [True: 0, False: 385k]
  ------------------
  159|      0|		return (unsigned int) g_value_get_flags(value);
  160|   385k|	else if (generic == G_TYPE_PARAM_UINT64) {
  ------------------
  |  |  223|   385k|#define	G_TYPE_PARAM_UINT64		   (g_param_spec_types[8])
  ------------------
  |  Branch (160:11): [True: 0, False: 385k]
  ------------------
  161|      0|		guint64 i = g_value_get_uint64(value);
  162|       |
  163|      0|		return g_int64_hash((gint64 *) &i);
  164|      0|	}
  165|   385k|	else if (generic == G_TYPE_PARAM_INT64) {
  ------------------
  |  |  200|   385k|#define	G_TYPE_PARAM_INT64		   (g_param_spec_types[7])
  ------------------
  |  Branch (165:11): [True: 0, False: 385k]
  ------------------
  166|      0|		gint64 i = g_value_get_int64(value);
  167|       |
  168|      0|		return g_int64_hash(&i);
  169|      0|	}
  170|   385k|	else if (generic == G_TYPE_PARAM_FLOAT) {
  ------------------
  |  |  315|   385k|#define	G_TYPE_PARAM_FLOAT		   (g_param_spec_types[12])
  ------------------
  |  Branch (170:11): [True: 0, False: 385k]
  ------------------
  171|      0|		float f = g_value_get_float(value);
  172|       |
  173|      0|		return g_direct_hash((void *) &f);
  174|      0|	}
  175|   385k|	else if (generic == G_TYPE_PARAM_DOUBLE) {
  ------------------
  |  |  338|   385k|#define	G_TYPE_PARAM_DOUBLE		   (g_param_spec_types[13])
  ------------------
  |  Branch (175:11): [True: 0, False: 385k]
  ------------------
  176|      0|		double d = g_value_get_double(value);
  177|       |
  178|      0|		return g_double_hash(&d);
  179|      0|	}
  180|   385k|	else if (generic == G_TYPE_PARAM_STRING) {
  ------------------
  |  |  361|   385k|#define	G_TYPE_PARAM_STRING		   (g_param_spec_types[14])
  ------------------
  |  Branch (180:11): [True: 2.11k, False: 383k]
  ------------------
  181|  2.11k|		const char *s = g_value_get_string(value);
  182|       |
  183|  2.11k|		return s ? g_str_hash(s) : 0;
  ------------------
  |  Branch (183:10): [True: 2.11k, False: 0]
  ------------------
  184|  2.11k|	}
  185|   383k|	else if (generic == G_TYPE_PARAM_BOXED) {
  ------------------
  |  |  407|   383k|#define	G_TYPE_PARAM_BOXED		   (g_param_spec_types[16])
  ------------------
  |  Branch (185:11): [True: 84.7k, False: 298k]
  ------------------
  186|  84.7k|		void *p = g_value_get_boxed(value);
  187|       |
  188|  84.7k|		return p ? g_direct_hash(p) : 0;
  ------------------
  |  Branch (188:10): [True: 84.7k, False: 0]
  ------------------
  189|  84.7k|	}
  190|   298k|	else if (generic == G_TYPE_PARAM_POINTER) {
  ------------------
  |  |  430|   298k|#define	G_TYPE_PARAM_POINTER		   (g_param_spec_types[17])
  ------------------
  |  Branch (190:11): [True: 0, False: 298k]
  ------------------
  191|      0|		void *p = g_value_get_pointer(value);
  192|       |
  193|      0|		return p ? g_direct_hash(p) : 0;
  ------------------
  |  Branch (193:10): [True: 0, False: 0]
  ------------------
  194|      0|	}
  195|   298k|	else if (generic == G_TYPE_PARAM_OBJECT) {
  ------------------
  |  |  482|   298k|#define	G_TYPE_PARAM_OBJECT		   (g_param_spec_types[19])
  ------------------
  |  Branch (195:11): [True: 298k, False: 0]
  ------------------
  196|   298k|		void *p = g_value_get_object(value);
  197|       |
  198|   298k|		return p ? g_direct_hash(p) : 0;
  ------------------
  |  Branch (198:10): [True: 298k, False: 0]
  ------------------
  199|   298k|	}
  200|      0|	else {
  201|       |		/* Fallback: convert to a string and hash that.
  202|       |		 * This is very slow, print a warning if we use it
  203|       |		 * so we can add another case.
  204|       |		 */
  205|      0|		char *s;
  206|      0|		unsigned int hash;
  207|       |
  208|      0|		s = g_strdup_value_contents(value);
  209|      0|		hash = g_str_hash(s);
  210|       |
  211|      0|		printf("vips_value_hash: no case for %s\n", s);
  212|      0|		printf("\ttype %d, %s\n",
  213|      0|			(int) G_VALUE_TYPE(value),
  ------------------
  |  |   59|      0|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
  214|      0|			g_type_name(G_VALUE_TYPE(value)));
  ------------------
  |  |   59|      0|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
  215|      0|		printf("\tgeneric %d, %s\n",
  216|      0|			(int) G_VALUE_TYPE(generic),
  ------------------
  |  |   59|      0|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
  217|      0|			g_type_name(generic));
  218|       |
  219|      0|		g_free(s);
  220|       |
  221|      0|		return hash;
  222|      0|	}
  223|   560k|}
cache.c:vips_operation_equal:
  422|   419k|{
  423|   419k|	if (a == b)
  ------------------
  |  Branch (423:6): [True: 408k, False: 10.7k]
  ------------------
  424|   408k|		return TRUE;
  ------------------
  |  |  798|   408k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   408k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  425|       |
  426|  10.7k|	if (G_OBJECT_TYPE(a) == G_OBJECT_TYPE(b) &&
  ------------------
  |  |   95|  10.7k|#define G_OBJECT_TYPE(object)       (G_TYPE_FROM_INSTANCE (object))
  |  |  ------------------
  |  |  |  |  602|  10.7k|#define G_TYPE_FROM_INSTANCE(instance)                          (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  10.7k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              	if (G_OBJECT_TYPE(a) == G_OBJECT_TYPE(b) &&
  ------------------
  |  |   95|  21.4k|#define G_OBJECT_TYPE(object)       (G_TYPE_FROM_INSTANCE (object))
  |  |  ------------------
  |  |  |  |  602|  10.7k|#define G_TYPE_FROM_INSTANCE(instance)                          (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  10.7k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (426:6): [True: 10.6k, False: 57]
  ------------------
  427|  10.7k|		vips_operation_hash(a) == vips_operation_hash(b) &&
  ------------------
  |  Branch (427:3): [True: 10.6k, False: 0]
  ------------------
  428|  10.7k|		!vips_argument_map(VIPS_OBJECT(a), vips_object_equal_arg, b, NULL))
  ------------------
  |  |  433|  10.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  10.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (428:3): [True: 9.02k, False: 1.62k]
  ------------------
  429|  9.02k|		return TRUE;
  ------------------
  |  |  798|  9.02k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  9.02k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  430|       |
  431|  1.67k|	return FALSE;
  ------------------
  |  |  794|  1.67k|#define	FALSE	(0)
  ------------------
  432|  10.7k|}
cache.c:vips_cache_remove:
  585|  90.5k|{
  586|  90.5k|	VipsOperationCacheEntry *entry = vips_cache_operation_get(operation);
  587|       |
  588|       |#ifdef DEBUG
  589|       |	printf("vips_cache_remove: ");
  590|       |	vips_object_print_summary(VIPS_OBJECT(operation));
  591|       |#endif /*DEBUG*/
  592|       |
  593|  90.5k|	g_assert(entry);
  ------------------
  |  |  166|  90.5k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  90.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  90.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  594|       |
  595|  90.5k|	if (entry->invalidate_id) {
  ------------------
  |  Branch (595:6): [True: 90.5k, False: 0]
  ------------------
  596|  90.5k|		g_signal_handler_disconnect(operation, entry->invalidate_id);
  597|  90.5k|		entry->invalidate_id = 0;
  598|  90.5k|	}
  599|       |
  600|  90.5k|	g_hash_table_remove(vips_cache_table, operation);
  601|  90.5k|	vips_cache_unref(operation);
  602|       |
  603|  90.5k|	g_free(entry);
  604|  90.5k|}
cache.c:vips_cache_unref:
  564|  90.5k|{
  565|       |#ifdef DEBUG
  566|       |	printf("vips_cache_unref: ");
  567|       |	vips_object_print_summary(VIPS_OBJECT(operation));
  568|       |#endif /*DEBUG*/
  569|       |
  570|  90.5k|	(void) vips_argument_map(VIPS_OBJECT(operation),
  ------------------
  |  |  433|  90.5k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  90.5k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  90.5k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  571|  90.5k|		vips_object_unref_arg, operation, NULL);
  572|  90.5k|	g_object_unref(operation);
  573|  90.5k|}
cache.c:vips_object_unref_arg:
  535|   658k|{
  536|   658k|	if ((argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (536:6): [True: 477k, False: 181k]
  ------------------
  537|   658k|		(argument_class->flags & VIPS_ARGUMENT_OUTPUT) &&
  ------------------
  |  Branch (537:3): [True: 102k, False: 375k]
  ------------------
  538|   658k|		argument_instance->assigned &&
  ------------------
  |  Branch (538:3): [True: 102k, False: 0]
  ------------------
  539|   658k|		G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|   102k|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|   102k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   102k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   102k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   102k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   102k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 102k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   102k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   102k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 102k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 90.3k, False: 11.6k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   102k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  90.3k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  90.3k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   102k|  else \
  |  |  |  |  |  | 2321|   102k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   102k|  __r; \
  |  |  |  |  |  | 2323|   102k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 90.3k, False: 11.6k]
  |  |  ------------------
  ------------------
  540|  90.3k|		GObject *value;
  541|       |
  542|       |		/* This will up the ref count for us.
  543|       |		 */
  544|  90.3k|		g_object_get(G_OBJECT(object),
  ------------------
  |  |   51|  90.3k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  90.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  90.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  545|  90.3k|			g_param_spec_get_name(pspec), &value, NULL);
  546|       |
  547|       |		/* This operation is probably going, so we must wipe the operation
  548|       |		 * pointer on the object.
  549|       |		 */
  550|  90.3k|		g_object_set_data(value, "libvips-operation", NULL);
  551|       |
  552|       |		/* Drop the ref we just got, then drop the ref we make when we
  553|       |		 * added to the cache.
  554|       |		 */
  555|  90.3k|		g_object_unref(value);
  556|  90.3k|		g_object_unref(value);
  557|  90.3k|	}
  558|       |
  559|   658k|	return NULL;
  560|   658k|}
cache.c:vips_cache_operation_get:
  577|   642k|{
  578|   642k|	return g_hash_table_lookup(vips_cache_table, operation);
  579|   642k|}
cache.c:vips_cache_ref:
  703|  99.6k|{
  704|       |#ifdef DEBUG
  705|       |	printf("vips_cache_ref: ");
  706|       |	vips_object_print_summary(VIPS_OBJECT(operation));
  707|       |#endif /*DEBUG*/
  708|       |
  709|  99.6k|	g_object_ref(operation);
  710|  99.6k|	(void) vips_argument_map(VIPS_OBJECT(operation),
  ------------------
  |  |  433|  99.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  99.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  99.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  711|  99.6k|		vips_object_ref_arg, operation, NULL);
  712|       |
  713|  99.6k|	vips_operation_touch(operation);
  714|  99.6k|}
cache.c:vips_object_ref_arg:
  612|   712k|{
  613|   712k|	VipsOperation *operation = VIPS_OPERATION(a);
  ------------------
  |  |   57|   712k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   712k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   712k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|   712k|		VIPS_TYPE_OPERATION, VipsOperation))
  ------------------
  614|       |
  615|   712k|	if ((argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (615:6): [True: 513k, False: 199k]
  ------------------
  616|   712k|		(argument_class->flags & VIPS_ARGUMENT_OUTPUT) &&
  ------------------
  |  Branch (616:3): [True: 111k, False: 402k]
  ------------------
  617|   712k|		argument_instance->assigned &&
  ------------------
  |  Branch (617:3): [True: 111k, False: 0]
  ------------------
  618|   712k|		G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|   111k|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|   111k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   111k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   111k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   111k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   111k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 111k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   111k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   111k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 111k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 99.1k, False: 11.9k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   111k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  99.1k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  99.1k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   111k|  else \
  |  |  |  |  |  | 2321|   111k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   111k|  __r; \
  |  |  |  |  |  | 2323|   111k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 99.1k, False: 11.9k]
  |  |  ------------------
  ------------------
  619|  99.1k|		GObject *value;
  620|       |
  621|       |		/* This will up the ref count for us.
  622|       |		 */
  623|  99.1k|		g_object_get(G_OBJECT(object),
  ------------------
  |  |   51|  99.1k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  99.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  99.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  624|  99.1k|			g_param_spec_get_name(pspec), &value, NULL);
  625|       |
  626|       |		/* This object has been made by this operation.
  627|       |		 */
  628|  99.1k|		g_object_set_data(value, "libvips-operation", operation);
  629|  99.1k|	}
  630|       |
  631|   712k|	return NULL;
  632|   712k|}
cache.c:vips_operation_touch:
  685|  99.6k|{
  686|  99.6k|	vips_cache_time += 1;
  687|       |
  688|       |	/* Touch the operations on the upstream trees on all input images.
  689|       |	 */
  690|  99.6k|	(void) vips_argument_map(VIPS_OBJECT(operation),
  ------------------
  |  |  433|  99.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  99.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  99.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  691|  99.6k|		vips_object_touch_arg, NULL, NULL);
  692|       |
  693|       |	/* And this operation.
  694|       |	 */
  695|  99.6k|	vips_operation_touch_operation(operation);
  696|  99.6k|}
cache.c:vips_object_touch_arg:
  664|   712k|{
  665|   712k|	if ((argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (665:6): [True: 513k, False: 199k]
  ------------------
  666|   712k|		(argument_class->flags & VIPS_ARGUMENT_INPUT) &&
  ------------------
  |  Branch (666:3): [True: 402k, False: 111k]
  ------------------
  667|   712k|		argument_instance->assigned &&
  ------------------
  |  Branch (667:3): [True: 205k, False: 196k]
  ------------------
  668|   712k|		g_type_is_a(G_PARAM_SPEC_VALUE_TYPE(pspec), VIPS_TYPE_IMAGE)) {
  ------------------
  |  |  103|   205k|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|   205k|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|   205k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|   205k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              		g_type_is_a(G_PARAM_SPEC_VALUE_TYPE(pspec), VIPS_TYPE_IMAGE)) {
  ------------------
  |  |  169|   205k|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  ------------------
  |  Branch (668:3): [True: 76.4k, False: 128k]
  ------------------
  669|  76.4k|		VipsImage *image;
  670|       |
  671|  76.4k|		g_object_get(G_OBJECT(object),
  ------------------
  |  |   51|  76.4k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  76.4k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  76.4k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  672|  76.4k|			g_param_spec_get_name(pspec), &image, NULL);
  673|       |
  674|  76.4k|		(void) vips__link_map(image, TRUE,
  ------------------
  |  |  798|  76.4k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  76.4k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  675|  76.4k|			(VipsSListMap2Fn) vips_image_touch_cb, NULL, NULL);
  676|       |
  677|  76.4k|		VIPS_UNREF(image);
  ------------------
  |  |   57|  76.4k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  76.4k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  76.4k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  76.4k|	{ \
  |  |  |  |   43|  76.4k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 76.4k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  76.4k|			(void) F((S)); \
  |  |  |  |   45|  76.4k|			(S) = 0; \
  |  |  |  |   46|  76.4k|		} \
  |  |  |  |   47|  76.4k|	} \
  |  |  |  |   48|  76.4k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  76.4k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  678|  76.4k|	}
  679|       |
  680|   712k|	return NULL;
  681|   712k|}
cache.c:vips_image_touch_cb:
  648|   207k|{
  649|   207k|	VipsOperation *operation =
  650|   207k|		VIPS_OPERATION(g_object_get_data(G_OBJECT(image), "libvips-operation"));
  ------------------
  |  |   57|   207k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   207k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   207k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|   207k|		VIPS_TYPE_OPERATION, VipsOperation))
  ------------------
  651|       |
  652|   207k|	if (operation)
  ------------------
  |  Branch (652:6): [True: 127k, False: 80.1k]
  ------------------
  653|   127k|		vips_operation_touch_operation(operation);
  654|       |
  655|   207k|	return NULL;
  656|   207k|}
cache.c:vips_operation_touch_operation:
  636|   227k|{
  637|   227k|	VipsOperationCacheEntry *entry = vips_cache_operation_get(operation);
  638|       |
  639|       |	/* Don't up the time for invalid items -- we want them to fall out of
  640|       |	 * cache.
  641|       |	 */
  642|   227k|	if (!entry->invalid)
  ------------------
  |  Branch (642:6): [True: 227k, False: 0]
  ------------------
  643|   227k|		entry->time = vips_cache_time;
  644|   227k|}
cache.c:vips_object_equal_arg:
  376|  61.5k|{
  377|  61.5k|	VipsObject *other = (VipsObject *) a;
  378|       |
  379|  61.5k|	const char *name = g_param_spec_get_name(pspec);
  380|  61.5k|	GType type = G_PARAM_SPEC_VALUE_TYPE(pspec);
  ------------------
  |  |  103|  61.5k|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|  61.5k|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  61.5k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  61.5k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  381|  61.5k|	GValue v1 = G_VALUE_INIT;
  ------------------
  |  |  191|  61.5k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
  382|  61.5k|	GValue v2 = G_VALUE_INIT;
  ------------------
  |  |  191|  61.5k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
  383|       |
  384|  61.5k|	gboolean equal;
  385|       |
  386|       |	/* Only test assigned input constructor args. Avoid the nohash args as
  387|       |	 * well.
  388|       |	 */
  389|  61.5k|	if (!(argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) ||
  ------------------
  |  Branch (389:6): [True: 21.2k, False: 40.2k]
  ------------------
  390|  61.5k|		!(argument_class->flags & VIPS_ARGUMENT_INPUT) ||
  ------------------
  |  Branch (390:3): [True: 10.6k, False: 29.6k]
  ------------------
  391|  61.5k|		(argument_class->flags & VIPS_ARGUMENT_NON_HASHABLE) ||
  ------------------
  |  Branch (391:3): [True: 0, False: 29.6k]
  ------------------
  392|  61.5k|		!argument_instance->assigned)
  ------------------
  |  Branch (392:3): [True: 0, False: 29.6k]
  ------------------
  393|  31.9k|		return NULL;
  394|       |
  395|       |	/* If this is an optional arg, we need to check that this was
  396|       |	 * assigned on @other as well.
  397|       |	 */
  398|  29.6k|	if (!(argument_class->flags & VIPS_ARGUMENT_REQUIRED) &&
  ------------------
  |  Branch (398:6): [True: 8.68k, False: 20.9k]
  ------------------
  399|  29.6k|		!vips_object_argument_isset(other, name))
  ------------------
  |  Branch (399:3): [True: 0, False: 8.68k]
  ------------------
  400|       |		/* Optional and was not set on other ... we've found a
  401|       |		 * difference!
  402|       |		 */
  403|      0|		return (void *) name;
  404|       |
  405|  29.6k|	g_value_init(&v1, type);
  406|  29.6k|	g_value_init(&v2, type);
  407|  29.6k|	g_object_get_property(G_OBJECT(object), name, &v1);
  ------------------
  |  |   51|  29.6k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  29.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  29.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  408|  29.6k|	g_object_get_property(G_OBJECT(other), name, &v2);
  ------------------
  |  |   51|  29.6k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  29.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  29.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  409|  29.6k|	equal = vips_value_equal(pspec, &v1, &v2);
  410|  29.6k|	g_value_unset(&v1);
  411|  29.6k|	g_value_unset(&v2);
  412|       |
  413|       |	/* Stop (return non-NULL) if we've found a difference.
  414|       |	 */
  415|  29.6k|	return !equal ? (void *) name : NULL;
  ------------------
  |  Branch (415:9): [True: 1.62k, False: 28.0k]
  ------------------
  416|  29.6k|}
cache.c:vips_value_equal:
  231|  29.6k|{
  232|  29.6k|	GType generic = G_PARAM_SPEC_TYPE(pspec);
  ------------------
  |  |   89|  29.6k|#define G_PARAM_SPEC_TYPE(pspec)	(G_TYPE_FROM_INSTANCE (pspec))
  |  |  ------------------
  |  |  |  |  602|  29.6k|#define G_TYPE_FROM_INSTANCE(instance)                          (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  29.6k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  233|  29.6k|	GType t1 = G_VALUE_TYPE(v1);
  ------------------
  |  |   59|  29.6k|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
  234|  29.6k|	GType t2 = G_VALUE_TYPE(v2);
  ------------------
  |  |   59|  29.6k|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
  235|       |
  236|  29.6k|	if (t1 != t2)
  ------------------
  |  Branch (236:6): [True: 0, False: 29.6k]
  ------------------
  237|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  238|       |
  239|       |	/* Not compile-time constants, so we have to use a set of if()s. Could
  240|       |	 * make a table at run time I guess.
  241|       |	 */
  242|       |
  243|  29.6k|	if (generic == G_TYPE_PARAM_BOOLEAN)
  ------------------
  |  |   85|  29.6k|#define	G_TYPE_PARAM_BOOLEAN		   (g_param_spec_types[2])
  ------------------
  |  Branch (243:6): [True: 0, False: 29.6k]
  ------------------
  244|      0|		return g_value_get_boolean(v1) == g_value_get_boolean(v2);
  245|  29.6k|	else if (generic == G_TYPE_PARAM_CHAR)
  ------------------
  |  |   39|  29.6k|#define	G_TYPE_PARAM_CHAR		   (g_param_spec_types[0])
  ------------------
  |  Branch (245:11): [True: 0, False: 29.6k]
  ------------------
  246|      0|		return g_value_get_schar(v1) == g_value_get_schar(v2);
  247|  29.6k|	if (generic == G_TYPE_PARAM_UCHAR)
  ------------------
  |  |   62|  29.6k|#define	G_TYPE_PARAM_UCHAR		   (g_param_spec_types[1])
  ------------------
  |  Branch (247:6): [True: 0, False: 29.6k]
  ------------------
  248|      0|		return g_value_get_uchar(v1) == g_value_get_uchar(v2);
  249|  29.6k|	if (generic == G_TYPE_PARAM_INT)
  ------------------
  |  |  108|  29.6k|#define	G_TYPE_PARAM_INT		   (g_param_spec_types[3])
  ------------------
  |  Branch (249:6): [True: 27.6k, False: 1.95k]
  ------------------
  250|  27.6k|		return g_value_get_int(v1) == g_value_get_int(v2);
  251|  1.95k|	if (generic == G_TYPE_PARAM_UINT)
  ------------------
  |  |  131|  1.95k|#define	G_TYPE_PARAM_UINT		   (g_param_spec_types[4])
  ------------------
  |  Branch (251:6): [True: 0, False: 1.95k]
  ------------------
  252|      0|		return g_value_get_uint(v1) == g_value_get_uint(v2);
  253|  1.95k|	if (generic == G_TYPE_PARAM_LONG)
  ------------------
  |  |  154|  1.95k|#define	G_TYPE_PARAM_LONG		   (g_param_spec_types[5])
  ------------------
  |  Branch (253:6): [True: 0, False: 1.95k]
  ------------------
  254|      0|		return g_value_get_long(v1) == g_value_get_long(v2);
  255|  1.95k|	if (generic == G_TYPE_PARAM_ULONG)
  ------------------
  |  |  177|  1.95k|#define	G_TYPE_PARAM_ULONG		   (g_param_spec_types[6])
  ------------------
  |  Branch (255:6): [True: 0, False: 1.95k]
  ------------------
  256|      0|		return g_value_get_ulong(v1) == g_value_get_ulong(v2);
  257|  1.95k|	if (generic == G_TYPE_PARAM_ENUM)
  ------------------
  |  |  269|  1.95k|#define	G_TYPE_PARAM_ENUM		   (g_param_spec_types[10])
  ------------------
  |  Branch (257:6): [True: 0, False: 1.95k]
  ------------------
  258|      0|		return g_value_get_enum(v1) == g_value_get_enum(v2);
  259|  1.95k|	if (generic == G_TYPE_PARAM_FLAGS)
  ------------------
  |  |  292|  1.95k|#define	G_TYPE_PARAM_FLAGS		   (g_param_spec_types[11])
  ------------------
  |  Branch (259:6): [True: 0, False: 1.95k]
  ------------------
  260|      0|		return g_value_get_flags(v1) == g_value_get_flags(v2);
  261|  1.95k|	if (generic == G_TYPE_PARAM_UINT64)
  ------------------
  |  |  223|  1.95k|#define	G_TYPE_PARAM_UINT64		   (g_param_spec_types[8])
  ------------------
  |  Branch (261:6): [True: 0, False: 1.95k]
  ------------------
  262|      0|		return g_value_get_uint64(v1) == g_value_get_uint64(v2);
  263|  1.95k|	if (generic == G_TYPE_PARAM_INT64)
  ------------------
  |  |  200|  1.95k|#define	G_TYPE_PARAM_INT64		   (g_param_spec_types[7])
  ------------------
  |  Branch (263:6): [True: 0, False: 1.95k]
  ------------------
  264|      0|		return g_value_get_int64(v1) == g_value_get_int64(v2);
  265|  1.95k|	if (generic == G_TYPE_PARAM_FLOAT)
  ------------------
  |  |  315|  1.95k|#define	G_TYPE_PARAM_FLOAT		   (g_param_spec_types[12])
  ------------------
  |  Branch (265:6): [True: 0, False: 1.95k]
  ------------------
  266|      0|		return g_value_get_float(v1) == g_value_get_float(v2);
  267|  1.95k|	if (generic == G_TYPE_PARAM_DOUBLE)
  ------------------
  |  |  338|  1.95k|#define	G_TYPE_PARAM_DOUBLE		   (g_param_spec_types[13])
  ------------------
  |  Branch (267:6): [True: 0, False: 1.95k]
  ------------------
  268|      0|		return g_value_get_double(v1) == g_value_get_double(v2);
  269|  1.95k|	if (generic == G_TYPE_PARAM_STRING) {
  ------------------
  |  |  361|  1.95k|#define	G_TYPE_PARAM_STRING		   (g_param_spec_types[14])
  ------------------
  |  Branch (269:6): [True: 339, False: 1.62k]
  ------------------
  270|    339|		const char *s1 = g_value_get_string(v1);
  271|    339|		const char *s2 = g_value_get_string(v2);
  272|       |
  273|    339|		if (s1 == s2)
  ------------------
  |  Branch (273:7): [True: 0, False: 339]
  ------------------
  274|      0|			return TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  275|    339|		else
  276|    339|			return s1 && s2 && strcmp(s1, s2) == 0;
  ------------------
  |  Branch (276:11): [True: 339, False: 0]
  |  Branch (276:17): [True: 339, False: 0]
  |  Branch (276:23): [True: 339, False: 0]
  ------------------
  277|    339|	}
  278|  1.62k|	if (generic == G_TYPE_PARAM_BOXED)
  ------------------
  |  |  407|  1.62k|#define	G_TYPE_PARAM_BOXED		   (g_param_spec_types[16])
  ------------------
  |  Branch (278:6): [True: 0, False: 1.62k]
  ------------------
  279|      0|		return g_value_get_boxed(v1) == g_value_get_boxed(v2);
  280|  1.62k|	if (generic == G_TYPE_PARAM_POINTER)
  ------------------
  |  |  430|  1.62k|#define	G_TYPE_PARAM_POINTER		   (g_param_spec_types[17])
  ------------------
  |  Branch (280:6): [True: 0, False: 1.62k]
  ------------------
  281|      0|		return g_value_get_pointer(v1) == g_value_get_pointer(v2);
  282|  1.62k|	if (generic == G_TYPE_PARAM_OBJECT)
  ------------------
  |  |  482|  1.62k|#define	G_TYPE_PARAM_OBJECT		   (g_param_spec_types[19])
  ------------------
  |  Branch (282:6): [True: 1.62k, False: 0]
  ------------------
  283|  1.62k|		return g_value_get_object(v1) == g_value_get_object(v2);
  284|      0|	else {
  285|       |		/* Fallback: convert to a string and compare that.
  286|       |		 * This is very slow, print a warning if we use it
  287|       |		 * so we can add another case.
  288|       |		 */
  289|      0|		char *s1;
  290|      0|		char *s2;
  291|      0|		gboolean equal;
  292|       |
  293|      0|		s1 = g_strdup_value_contents(v1);
  294|      0|		s2 = g_strdup_value_contents(v2);
  295|      0|		equal = strcmp(s1, s2) == 0;
  296|       |
  297|      0|		printf("vips_value_equal: no case for %s, %s\n",
  298|      0|			s1, s2);
  299|      0|		printf("\tt1 %d, %s\n", (int) t1, g_type_name(t1));
  300|      0|		printf("\tt2 %d, %s\n", (int) t2, g_type_name(t2));
  301|      0|		printf("\tgeneric %d, %s\n",
  302|      0|			(int) G_VALUE_TYPE(generic),
  ------------------
  |  |   59|      0|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
  303|      0|			g_type_name(generic));
  304|       |
  305|      0|		g_free(s1);
  306|      0|		g_free(s2);
  307|       |
  308|      0|		return equal;
  309|      0|	}
  310|  1.62k|}
cache.c:vips_cache_insert:
  730|  90.6k|{
  731|  90.6k|	VipsOperationCacheEntry *entry = g_new(VipsOperationCacheEntry, 1);
  ------------------
  |  |  282|  90.6k|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  90.6k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  90.6k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  90.6k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  90.6k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  90.6k|	  gpointer __p;						\
  |  |  |  |  231|  90.6k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 90.6k]
  |  |  |  |  ------------------
  |  |  |  |  232|  90.6k|	    __p = g_##func (__n);				\
  |  |  |  |  233|  90.6k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 90.6k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  90.6k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 90.6k]
  |  |  |  |  |  Branch (234:26): [True: 90.6k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  90.6k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  90.6k|	  else							\
  |  |  |  |  237|  90.6k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  90.6k|	  __p;							\
  |  |  |  |  239|  90.6k|	}))
  |  |  ------------------
  ------------------
  732|       |
  733|       |#ifdef VIPS_DEBUG
  734|       |	printf("vips_cache_insert: adding to cache");
  735|       |	vips_object_print_dump(VIPS_OBJECT(operation));
  736|       |#endif /*VIPS_DEBUG*/
  737|       |
  738|  90.6k|	entry->operation = operation;
  739|  90.6k|	entry->time = 0;
  740|  90.6k|	entry->invalidate_id = 0;
  741|  90.6k|	entry->invalid = FALSE;
  ------------------
  |  |  794|  90.6k|#define	FALSE	(0)
  ------------------
  742|       |
  743|  90.6k|	g_hash_table_insert(vips_cache_table, operation, entry);
  744|  90.6k|	vips_cache_ref(operation);
  745|       |
  746|       |	/* If the operation signals "invalidate", we must tag this cache entry
  747|       |	 * for removal.
  748|       |	 */
  749|  90.6k|	entry->invalidate_id = g_signal_connect(operation, "invalidate",
  ------------------
  |  |  491|  90.6k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  750|  90.6k|		G_CALLBACK(vips_cache_invalidate_cb), entry);
  751|  90.6k|}
cache.c:vips_cache_invalidate_cb:
  719|  11.2k|{
  720|       |#ifdef DEBUG
  721|       |	printf("vips_cache_invalidate_cb: ");
  722|       |	vips_object_print_summary(VIPS_OBJECT(operation));
  723|       |#endif /*DEBUG*/
  724|       |
  725|  11.2k|	entry->invalid = TRUE;
  ------------------
  |  |  798|  11.2k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  11.2k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  726|  11.2k|}
cache.c:vips_cache_trim:
  840|   161k|{
  841|   161k|	VipsOperation *operation;
  842|       |
  843|   161k|	g_mutex_lock(&vips_cache_lock);
  844|       |
  845|   252k|	while (vips_cache_table &&
  ------------------
  |  Branch (845:9): [True: 252k, False: 0]
  ------------------
  846|   252k|		(g_hash_table_size(vips_cache_table) > vips_cache_max ||
  ------------------
  |  Branch (846:4): [True: 86.3k, False: 165k]
  ------------------
  847|   252k|			vips_tracked_get_files() > vips_cache_max_files ||
  ------------------
  |  Branch (847:4): [True: 0, False: 165k]
  ------------------
  848|   252k|			vips_tracked_get_mem() > vips_cache_max_mem) &&
  ------------------
  |  Branch (848:4): [True: 4.22k, False: 161k]
  ------------------
  849|   252k|		(operation = vips_cache_get_lru())) {
  ------------------
  |  Branch (849:3): [True: 90.5k, False: 49]
  ------------------
  850|       |#ifdef DEBUG
  851|       |		printf("vips_cache_trim: trimming ");
  852|       |		vips_object_print_summary(VIPS_OBJECT(operation));
  853|       |#endif /*DEBUG*/
  854|       |
  855|  90.5k|		vips_cache_remove(operation);
  856|  90.5k|	}
  857|       |
  858|   161k|	g_mutex_unlock(&vips_cache_lock);
  859|   161k|}
cache.c:vips_cache_get_lru:
  823|  90.6k|{
  824|  90.6k|	VipsOperationCacheEntry *entry;
  825|       |
  826|  90.6k|	entry = NULL;
  827|  90.6k|	g_hash_table_foreach(vips_cache_table,
  828|  90.6k|		(GHFunc) vips_cache_get_lru_cb, &entry);
  829|       |
  830|  90.6k|	if (entry)
  ------------------
  |  Branch (830:6): [True: 90.5k, False: 49]
  ------------------
  831|  90.5k|		return entry->operation;
  832|       |
  833|     49|	return NULL;
  834|  90.6k|}
cache.c:vips_cache_get_lru_cb:
  811|  8.92M|{
  812|  8.92M|	if (!*best ||
  ------------------
  |  Branch (812:6): [True: 90.5k, False: 8.83M]
  ------------------
  813|  8.92M|		(*best)->time > value->time)
  ------------------
  |  Branch (813:3): [True: 365k, False: 8.46M]
  ------------------
  814|   455k|		*best = value;
  815|  8.92M|}

vips_connection_filename:
  156|  22.5k|{
  157|  22.5k|	return connection->filename;
  158|  22.5k|}
vips_connection_nick:
  169|  1.22M|{
  170|  1.22M|	return connection->filename ? connection->filename
  ------------------
  |  Branch (170:9): [True: 0, False: 1.22M]
  ------------------
  171|  1.22M|								: VIPS_OBJECT(connection)->nickname;
  ------------------
  |  |  433|  1.22M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  1.22M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.22M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  172|  1.22M|}
connection.c:vips_connection_class_init:
  118|      1|{
  119|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  120|       |
  121|      1|	gobject_class->finalize = vips_connection_finalize;
  122|      1|	gobject_class->set_property = vips_object_set_property;
  123|      1|	gobject_class->get_property = vips_object_get_property;
  124|       |
  125|      1|	VIPS_ARG_INT(class, "descriptor", 1,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  126|      1|		_("Descriptor"),
  127|      1|		_("File descriptor for read or write"),
  128|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  129|      1|		G_STRUCT_OFFSET(VipsConnection, descriptor),
  130|      1|		-1, 1000000000, 0);
  131|       |
  132|      1|	VIPS_ARG_STRING(class, "filename", 2,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  133|      1|		_("Filename"),
  134|      1|		_("Name of file to open"),
  135|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  136|      1|		G_STRUCT_OFFSET(VipsConnection, filename),
  137|      1|		NULL);
  138|      1|}
connection.c:vips_connection_finalize:
   88|   100k|{
   89|   100k|	VipsConnection *connection = (VipsConnection *) gobject;
   90|       |
   91|       |#ifdef VIPS_DEBUG
   92|       |	VIPS_DEBUG_MSG("vips_connection_finalize: ");
   93|       |	vips_object_print_name(VIPS_OBJECT(gobject));
   94|       |	VIPS_DEBUG_MSG("\n");
   95|       |#endif /*VIPS_DEBUG*/
   96|       |
   97|   100k|	if (connection->tracked_descriptor >= 0) {
  ------------------
  |  Branch (97:6): [True: 0, False: 100k]
  ------------------
   98|      0|		VIPS_DEBUG_MSG("    tracked_close()\n");
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   99|      0|		vips_tracked_close(connection->tracked_descriptor);
  100|      0|		connection->tracked_descriptor = -1;
  101|      0|		connection->descriptor = -1;
  102|      0|	}
  103|       |
  104|   100k|	if (connection->close_descriptor >= 0) {
  ------------------
  |  Branch (104:6): [True: 0, False: 100k]
  ------------------
  105|      0|		VIPS_DEBUG_MSG("    close()\n");
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  106|      0|		close(connection->close_descriptor);
  107|      0|		connection->close_descriptor = -1;
  108|      0|		connection->descriptor = -1;
  109|      0|	}
  110|       |
  111|   100k|	VIPS_FREE(connection->filename);
  ------------------
  |  |   50|   100k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   100k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   100k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   100k|	{ \
  |  |  |  |   43|   100k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 100k]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|   100k|	} \
  |  |  |  |   48|   100k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   100k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  112|       |
  113|   100k|	G_OBJECT_CLASS(vips_connection_parent_class)->finalize(gobject);
  ------------------
  |  |   58|   100k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|   100k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   100k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  114|   100k|}
connection.c:vips_connection_init:
  142|   100k|{
  143|   100k|	connection->descriptor = -1;
  144|   100k|	connection->tracked_descriptor = -1;
  145|   100k|	connection->close_descriptor = -1;
  146|   100k|}

vips_dbuf_minimum_size:
   73|   439k|{
   74|   439k|	if (size > dbuf->allocated_size) {
  ------------------
  |  Branch (74:6): [True: 291k, False: 148k]
  ------------------
   75|   291k|		const size_t new_allocated_size = 3 * (16 + size) / 2;
   76|       |
   77|   291k|		unsigned char *new_data;
   78|       |
   79|   291k|		if (!(new_data =
  ------------------
  |  Branch (79:7): [True: 0, False: 291k]
  ------------------
   80|   291k|					g_try_realloc(dbuf->data, new_allocated_size))) {
   81|      0|			vips_error("VipsDbuf", "%s", _("out of memory"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   82|      0|			return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
   83|      0|		}
   84|       |
   85|   291k|		dbuf->data = new_data;
   86|   291k|		dbuf->allocated_size = new_allocated_size;
   87|   291k|	}
   88|       |
   89|   439k|	return TRUE;
  ------------------
  |  |  798|   439k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   439k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
   90|   439k|}
vips_dbuf_allocate:
  103|   294k|{
  104|   294k|	return vips_dbuf_minimum_size(dbuf, dbuf->write_point + size);
  105|   294k|}
vips_dbuf_write:
  172|   294k|{
  173|   294k|	if (!vips_dbuf_allocate(dbuf, size))
  ------------------
  |  Branch (173:6): [True: 0, False: 294k]
  ------------------
  174|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  175|       |
  176|   294k|	memcpy(dbuf->data + dbuf->write_point, data, size);
  177|   294k|	dbuf->write_point += size;
  178|   294k|	dbuf->data_size = VIPS_MAX(dbuf->data_size, dbuf->write_point);
  ------------------
  |  |   54|   294k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 294k]
  |  |  ------------------
  ------------------
  179|       |
  180|   294k|	return TRUE;
  ------------------
  |  |  798|   294k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   294k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  181|   294k|}
vips_dbuf_writef:
  195|   294k|{
  196|   294k|	va_list ap;
  197|       |
  198|   294k|	va_start(ap, fmt);
  199|   294k|	char *line = g_strdup_vprintf(fmt, ap);
  200|   294k|	va_end(ap);
  201|       |
  202|   294k|	if (vips_dbuf_write(dbuf, (unsigned char *) line, strlen(line))) {
  ------------------
  |  Branch (202:6): [True: 294k, False: 0]
  ------------------
  203|   294k|		g_free(line);
  204|   294k|		return FALSE;
  ------------------
  |  |  794|   294k|#define	FALSE	(0)
  ------------------
  205|   294k|	}
  206|      0|	g_free(line);
  207|       |
  208|      0|	return TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  209|   294k|}
vips_dbuf_reset:
  277|   145k|{
  278|   145k|	dbuf->write_point = 0;
  279|   145k|	dbuf->data_size = 0;
  280|   145k|}
vips_dbuf_destroy:
  291|   145k|{
  292|   145k|	vips_dbuf_reset(dbuf);
  293|       |
  294|   145k|	VIPS_FREE(dbuf->data);
  ------------------
  |  |   50|   145k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   145k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   145k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   145k|	{ \
  |  |  |  |   43|   145k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 145k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   145k|			(void) F((S)); \
  |  |  |  |   45|   145k|			(S) = 0; \
  |  |  |  |   46|   145k|		} \
  |  |  |  |   47|   145k|	} \
  |  |  |  |   48|   145k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   145k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  295|   145k|	dbuf->allocated_size = 0;
  296|   145k|}
vips_dbuf_string:
  441|   145k|{
  442|   145k|	vips_dbuf_null_terminate(dbuf);
  443|       |
  444|   145k|	if (size)
  ------------------
  |  Branch (444:6): [True: 0, False: 145k]
  ------------------
  445|      0|		*size = dbuf->data_size;
  446|       |
  447|   145k|	return dbuf->data;
  448|   145k|}
dbuf.c:vips_dbuf_null_terminate:
  387|   145k|{
  388|   145k|	if (!vips_dbuf_minimum_size(dbuf, dbuf->data_size + 1))
  ------------------
  |  Branch (388:6): [True: 0, False: 145k]
  ------------------
  389|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  390|       |
  391|   145k|	dbuf->data[dbuf->data_size] = 0;
  392|       |
  393|   145k|	return TRUE;
  ------------------
  |  |  798|   145k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   145k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  394|   145k|}

vips_error_freeze:
  146|  10.9k|{
  147|  10.9k|	g_mutex_lock(&vips__global_lock);
  148|  10.9k|	g_assert(vips_error_freeze_count >= 0);
  ------------------
  |  |  166|  10.9k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  149|  10.9k|	vips_error_freeze_count += 1;
  150|  10.9k|	g_mutex_unlock(&vips__global_lock);
  151|  10.9k|}
vips_error_thaw:
  160|  10.9k|{
  161|  10.9k|	g_mutex_lock(&vips__global_lock);
  162|  10.9k|	vips_error_freeze_count -= 1;
  163|  10.9k|	g_assert(vips_error_freeze_count >= 0);
  ------------------
  |  |  166|  10.9k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  164|  10.9k|	g_mutex_unlock(&vips__global_lock);
  165|  10.9k|}
vips_error_buffer:
  179|  5.22k|{
  180|  5.22k|	const char *msg;
  181|       |
  182|  5.22k|	g_mutex_lock(&vips__global_lock);
  183|  5.22k|	msg = vips_buf_all(&vips_error_buf);
  184|  5.22k|	g_mutex_unlock(&vips__global_lock);
  185|       |
  186|  5.22k|	return msg;
  187|  5.22k|}
vips_verror:
  230|  1.48M|{
  231|       |#ifdef VIPS_DEBUG
  232|       |	{
  233|       |		char txt[256];
  234|       |		VipsBuf buf = VIPS_BUF_STATIC(txt);
  235|       |		va_list ap2;
  236|       |
  237|       |		vips_buf_appendf(&buf, "%s: ", domain);
  238|       |		va_copy(ap2, ap);
  239|       |		vips_buf_vappendf(&buf, fmt, ap2);
  240|       |		vips_buf_appends(&buf, "\n");
  241|       |		VIPS_DEBUG_MSG("vips_verror: %s", vips_buf_all(&buf));
  242|       |	}
  243|       |#endif /*VIPS_DEBUG*/
  244|       |
  245|  1.48M|	g_mutex_lock(&vips__global_lock);
  246|  1.48M|	g_assert(vips_error_freeze_count >= 0);
  ------------------
  |  |  166|  1.48M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.48M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.48M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  247|  1.48M|	if (!vips_error_freeze_count) {
  ------------------
  |  Branch (247:6): [True: 1.48M, False: 0]
  ------------------
  248|  1.48M|		if (domain)
  ------------------
  |  Branch (248:7): [True: 1.48M, False: 0]
  ------------------
  249|  1.48M|			vips_buf_appendf(&vips_error_buf, "%s: ", domain);
  250|  1.48M|		vips_buf_vappendf(&vips_error_buf, fmt, ap);
  251|  1.48M|		vips_buf_appends(&vips_error_buf, "\n");
  252|  1.48M|	}
  253|  1.48M|	g_mutex_unlock(&vips__global_lock);
  254|       |
  255|  1.48M|	if (vips__fatal)
  ------------------
  |  Branch (255:6): [True: 0, False: 1.48M]
  ------------------
  256|      0|		vips_error_exit("vips__fatal");
  257|  1.48M|}
vips_error:
  271|  84.0k|{
  272|  84.0k|	va_list ap;
  273|       |
  274|  84.0k|	va_start(ap, fmt);
  275|  84.0k|	vips_verror(domain, fmt, ap);
  276|  84.0k|	va_end(ap);
  277|  84.0k|}
vips_error_clear:
  381|  6.36k|{
  382|  6.36k|	g_mutex_lock(&vips__global_lock);
  383|  6.36k|	vips_buf_rewind(&vips_error_buf);
  384|  6.36k|	g_mutex_unlock(&vips__global_lock);
  385|  6.36k|}
vips_check_coding_known:
  493|  1.14k|{
  494|       |	/* These all have codings that extract/ifthenelse/etc can ignore.
  495|       |	 */
  496|  1.14k|	if (im->Coding != VIPS_CODING_NONE &&
  ------------------
  |  Branch (496:6): [True: 0, False: 1.14k]
  ------------------
  497|  1.14k|		im->Coding != VIPS_CODING_LABQ &&
  ------------------
  |  Branch (497:3): [True: 0, False: 0]
  ------------------
  498|  1.14k|		im->Coding != VIPS_CODING_RAD) {
  ------------------
  |  Branch (498:3): [True: 0, False: 0]
  ------------------
  499|      0|		vips_error(domain, "%s", _("unknown image coding"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  500|      0|		return -1;
  501|      0|	}
  502|       |
  503|  1.14k|	return 0;
  504|  1.14k|}
vips_check_coding:
  522|    701|{
  523|    701|	if (im->Coding != coding) {
  ------------------
  |  Branch (523:6): [True: 0, False: 701]
  ------------------
  524|      0|		vips_error(domain, _("coding '%s' only"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  525|      0|			vips_enum_nick(VIPS_TYPE_CODING, coding));
  ------------------
  |  |  148|      0|#define VIPS_TYPE_CODING (vips_coding_get_type())
  ------------------
  526|      0|		return -1;
  527|      0|	}
  528|       |
  529|    701|	return 0;
  530|    701|}
vips_check_bands_atleast:
  622|  2.14k|{
  623|  2.14k|	if (im->Bands < bands) {
  ------------------
  |  Branch (623:6): [True: 0, False: 2.14k]
  ------------------
  624|      0|		vips_error(domain,
  625|      0|			_("image must have at least %d bands"), bands);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  626|      0|		return -1;
  627|      0|	}
  628|       |
  629|  2.14k|	return 0;
  630|  2.14k|}
vips_check_noncomplex:
  702|  2.11k|{
  703|  2.11k|	if (vips_band_format_iscomplex(im->BandFmt)) {
  ------------------
  |  Branch (703:6): [True: 0, False: 2.11k]
  ------------------
  704|      0|		vips_error(domain, "%s", _("image must be non-complex"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  705|      0|		return -1;
  706|      0|	}
  707|       |
  708|  2.11k|	return 0;
  709|  2.11k|}
vips_check_vector:
 1142|  17.9k|{
 1143|       |	/* Here it's clearer to list the cases that are OK.
 1144|       |	 */
 1145|  17.9k|	if (n == im->Bands)
  ------------------
  |  Branch (1145:6): [True: 17.4k, False: 512]
  ------------------
 1146|  17.4k|		return 0;
 1147|    512|	if (n == 1)
  ------------------
  |  Branch (1147:6): [True: 512, False: 0]
  ------------------
 1148|    512|		return 0;
 1149|      0|	if (im->Bands == 1 &&
  ------------------
  |  Branch (1149:6): [True: 0, False: 0]
  ------------------
 1150|      0|		n > 1)
  ------------------
  |  Branch (1150:3): [True: 0, False: 0]
  ------------------
 1151|      0|		return 0;
 1152|       |
 1153|      0|	if (im->Bands == 1)
  ------------------
  |  Branch (1153:6): [True: 0, False: 0]
  ------------------
 1154|      0|		vips_error(domain,
 1155|      0|			"%s", _("vector must have 1 element"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1156|      0|	else
 1157|      0|		vips_error(domain,
 1158|      0|			_("vector must have 1 or %d elements"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1159|      0|			im->Bands);
 1160|       |
 1161|      0|	return -1;
 1162|      0|}

vips__thread_profile_attach:
  232|      2|{
  233|      2|	VipsThreadProfile *profile;
  234|       |
  235|      2|	VIPS_DEBUG_MSG("vips__thread_profile_attach: %s\n", thread_name);
  ------------------
  |  |   47|      2|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      2|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      2|	{ \
  |  |   49|      2|		; \
  |  |   50|      2|	} \
  |  |   51|      2|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      2|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  236|       |
  237|      2|	profile = g_new(VipsThreadProfile, 1);
  ------------------
  |  |  282|      2|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|      2|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|      2|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|      2|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|      2|	  gpointer __p;						\
  |  |  |  |  231|      2|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  |  |  232|      2|	    __p = g_##func (__n);				\
  |  |  |  |  233|      2|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 2, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|      2|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 2]
  |  |  |  |  |  Branch (234:26): [True: 2, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|      2|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|      2|	  else							\
  |  |  |  |  237|      2|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|      2|	  __p;							\
  |  |  |  |  239|      2|	}))
  |  |  ------------------
  ------------------
  238|      2|	profile->name = thread_name;
  239|      2|	profile->gates = g_hash_table_new_full(
  240|      2|		g_direct_hash, g_str_equal,
  241|      2|		NULL, (GDestroyNotify) vips_thread_gate_free);
  242|      2|	profile->memory = vips_thread_gate_new("memory");
  243|      2|	g_private_replace(&vips_thread_profile_key, profile);
  244|      2|}
vips__thread_profile_detach:
  259|  50.2k|{
  260|  50.2k|	VipsThreadProfile *profile;
  261|       |
  262|  50.2k|	VIPS_DEBUG_MSG("vips__thread_profile_detach:\n");
  ------------------
  |  |   47|  50.2k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  50.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  50.2k|	{ \
  |  |   49|  50.2k|		; \
  |  |   50|  50.2k|	} \
  |  |   51|  50.2k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  50.2k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  263|       |
  264|  50.2k|	if ((profile = vips_thread_profile_get())) {
  ------------------
  |  Branch (264:6): [True: 0, False: 50.2k]
  ------------------
  265|      0|		if (vips__thread_profile)
  ------------------
  |  Branch (265:7): [True: 0, False: 0]
  ------------------
  266|      0|			vips_thread_profile_save(profile);
  267|       |
  268|      0|		vips_thread_profile_free(profile);
  269|      0|		g_private_set(&vips_thread_profile_key, NULL);
  270|      0|	}
  271|  50.2k|}
vips__thread_gate_start:
  285|      4|{
  286|      4|	VipsThreadProfile *profile;
  287|       |
  288|      4|	VIPS_DEBUG_MSG_RED("vips__thread_gate_start: %s\n", gate_name);
  ------------------
  |  |   63|      4|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      4|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|      4|	{ \
  |  |   65|      4|		; \
  |  |   66|      4|	} \
  |  |   67|      4|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      4|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  289|       |
  290|      4|	if ((profile = vips_thread_profile_get())) {
  ------------------
  |  Branch (290:6): [True: 4, False: 0]
  ------------------
  291|      4|		gint64 time = g_get_monotonic_time();
  292|       |
  293|      4|		VipsThreadGate *gate;
  294|       |
  295|      4|		if (!(gate =
  ------------------
  |  Branch (295:7): [True: 4, False: 0]
  ------------------
  296|      4|					g_hash_table_lookup(profile->gates, gate_name))) {
  297|      4|			gate = vips_thread_gate_new(gate_name);
  298|      4|			g_hash_table_insert(profile->gates,
  299|      4|				(char *) gate_name, gate);
  300|      4|		}
  301|       |
  302|      4|		if (gate->start->i >= VIPS_GATE_SIZE)
  ------------------
  |  |   50|      4|#define VIPS_GATE_SIZE (1000)
  ------------------
  |  Branch (302:7): [True: 0, False: 4]
  ------------------
  303|      0|			vips_thread_gate_block_add(&gate->start);
  304|       |
  305|      4|		gate->start->time[gate->start->i++] = time;
  306|       |
  307|      4|		VIPS_DEBUG_MSG_RED("\t %" G_GINT64_FORMAT "\n", time);
  ------------------
  |  |   63|      4|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      4|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|      4|	{ \
  |  |   65|      4|		; \
  |  |   66|      4|	} \
  |  |   67|      4|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      4|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  308|      4|	}
  309|      4|}
vips__thread_gate_stop:
  313|      2|{
  314|      2|	VipsThreadProfile *profile;
  315|       |
  316|      2|	VIPS_DEBUG_MSG_RED("vips__thread_gate_stop: %s\n", gate_name);
  ------------------
  |  |   63|      2|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      2|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|      2|	{ \
  |  |   65|      2|		; \
  |  |   66|      2|	} \
  |  |   67|      2|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      2|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  317|       |
  318|      2|	if ((profile = vips_thread_profile_get())) {
  ------------------
  |  Branch (318:6): [True: 2, False: 0]
  ------------------
  319|      2|		gint64 time = g_get_monotonic_time();
  320|       |
  321|      2|		VipsThreadGate *gate;
  322|       |
  323|      2|		if (!(gate =
  ------------------
  |  Branch (323:7): [True: 0, False: 2]
  ------------------
  324|      2|					g_hash_table_lookup(profile->gates, gate_name))) {
  325|      0|			gate = vips_thread_gate_new(gate_name);
  326|      0|			g_hash_table_insert(profile->gates,
  327|      0|				(char *) gate_name, gate);
  328|      0|		}
  329|       |
  330|      2|		if (gate->stop->i >= VIPS_GATE_SIZE)
  ------------------
  |  |   50|      2|#define VIPS_GATE_SIZE (1000)
  ------------------
  |  Branch (330:7): [True: 0, False: 2]
  ------------------
  331|      0|			vips_thread_gate_block_add(&gate->stop);
  332|       |
  333|      2|		gate->stop->time[gate->stop->i++] = time;
  334|       |
  335|      2|		VIPS_DEBUG_MSG_RED("\t %" G_GINT64_FORMAT "\n", time);
  ------------------
  |  |   63|      2|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      2|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|      2|	{ \
  |  |   65|      2|		; \
  |  |   66|      2|	} \
  |  |   67|      2|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      2|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  336|      2|	}
  337|      2|}
gate.c:vips_thread_gate_new:
  219|      6|{
  220|      6|	VipsThreadGate *gate;
  221|       |
  222|      6|	gate = g_new(VipsThreadGate, 1);
  ------------------
  |  |  282|      6|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|      6|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      6|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|      6|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|      6|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|      6|	  gpointer __p;						\
  |  |  |  |  231|      6|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 6]
  |  |  |  |  ------------------
  |  |  |  |  232|      6|	    __p = g_##func (__n);				\
  |  |  |  |  233|      6|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 6, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|      6|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 6]
  |  |  |  |  |  Branch (234:26): [True: 6, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|      6|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|      6|	  else							\
  |  |  |  |  237|      6|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|      6|	  __p;							\
  |  |  |  |  239|      6|	}))
  |  |  ------------------
  ------------------
  223|      6|	gate->name = gate_name;
  224|      6|	gate->start = g_new0(VipsThreadGateBlock, 1);
  ------------------
  |  |  299|      6|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|      6|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      6|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|      6|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|      6|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|      6|	  gpointer __p;						\
  |  |  |  |  231|      6|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 6]
  |  |  |  |  ------------------
  |  |  |  |  232|      6|	    __p = g_##func (__n);				\
  |  |  |  |  233|      6|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 6, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|      6|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 6]
  |  |  |  |  |  Branch (234:26): [True: 6, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|      6|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|      6|	  else							\
  |  |  |  |  237|      6|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|      6|	  __p;							\
  |  |  |  |  239|      6|	}))
  |  |  ------------------
  ------------------
  225|      6|	gate->stop = g_new0(VipsThreadGateBlock, 1);
  ------------------
  |  |  299|      6|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|      6|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      6|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|      6|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|      6|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|      6|	  gpointer __p;						\
  |  |  |  |  231|      6|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 6]
  |  |  |  |  ------------------
  |  |  |  |  232|      6|	    __p = g_##func (__n);				\
  |  |  |  |  233|      6|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 6, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|      6|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 6]
  |  |  |  |  |  Branch (234:26): [True: 6, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|      6|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|      6|	  else							\
  |  |  |  |  237|      6|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|      6|	  __p;							\
  |  |  |  |  239|      6|	}))
  |  |  ------------------
  ------------------
  226|       |
  227|      6|	return gate;
  228|      6|}
gate.c:vips_thread_profile_get:
  248|  50.2k|{
  249|  50.2k|	return g_private_get(&vips_thread_profile_key);
  250|  50.2k|}

vips__link_break_all:
  183|   204k|{
  184|   204k|	g_mutex_lock(&vips__global_lock);
  185|       |
  186|   204k|	vips_slist_map2(image->upstream,
  187|   204k|		(VipsSListMap2Fn) vips__link_break, image, NULL);
  188|   204k|	vips_slist_map2(image->downstream,
  189|   204k|		(VipsSListMap2Fn) vips__link_break_rev, image, NULL);
  190|       |
  191|   204k|	g_assert(!image->upstream);
  ------------------
  |  |  166|   204k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   204k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   204k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|   204k|	g_assert(!image->downstream);
  ------------------
  |  |  166|   204k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   204k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   204k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|       |
  194|   204k|	g_mutex_unlock(&vips__global_lock);
  195|   204k|}
vips__link_map:
  239|   133k|{
  240|   133k|	static int serial = 0;
  241|       |
  242|   133k|	LinkMap map;
  243|   133k|	GSList *images;
  244|   133k|	GSList *p;
  245|   133k|	void *result;
  246|       |
  247|   133k|	images = NULL;
  248|       |
  249|       |	/* The function might do anything, including removing images
  250|       |	 * or invalidating other images, so we can't trigger them from within
  251|       |	 * the image loop. Instead we collect a list of images, ref them,
  252|       |	 * run the functions, and unref.
  253|       |	 */
  254|       |
  255|   133k|	map.upstream = upstream;
  256|   133k|	map.fn = (VipsSListMap2Fn) vips__link_map_cb;
  257|   133k|	map.a = (void *) &images;
  258|   133k|	map.b = NULL;
  259|       |
  260|       |	/* We will be walking the tree of images and updating the ->serial
  261|       |	 * member. There will be intense confusion if two threads try to do
  262|       |	 * this at the same time.
  263|       |	 */
  264|   133k|	g_mutex_lock(&vips__global_lock);
  265|       |
  266|   133k|	serial += 1;
  267|   133k|	map.serial = serial;
  268|       |
  269|   133k|	vips__link_mapp(image, &map, NULL);
  270|       |
  271|   716k|	for (p = images; p; p = p->next)
  ------------------
  |  Branch (271:19): [True: 583k, False: 133k]
  ------------------
  272|   583k|		g_object_ref(p->data);
  273|       |
  274|   133k|	g_mutex_unlock(&vips__global_lock);
  275|       |
  276|   133k|	result = vips_slist_map2(images, fn, a, b);
  277|       |
  278|   716k|	for (p = images; p; p = p->next)
  ------------------
  |  Branch (278:19): [True: 583k, False: 133k]
  ------------------
  279|   583k|		g_object_unref(p->data);
  280|   133k|	g_slist_free(images);
  281|       |
  282|   133k|	return result;
  283|   133k|}
vips__demand_hint_array:
  291|   195k|{
  292|   195k|	VipsDemandStyle hint = (VipsDemandStyle) int_hint;
  293|       |
  294|   195k|	int i, len, nany;
  295|   195k|	VipsDemandStyle set_hint;
  296|       |
  297|       |	/* How many input images are there? And how many are ANY?
  298|       |	 */
  299|   359k|	for (i = 0, len = 0, nany = 0; in[i]; i++, len++)
  ------------------
  |  Branch (299:33): [True: 163k, False: 195k]
  ------------------
  300|   163k|		if (in[i]->dhint == VIPS_DEMAND_STYLE_ANY)
  ------------------
  |  Branch (300:7): [True: 8.75k, False: 155k]
  ------------------
  301|  8.75k|			nany++;
  302|       |
  303|       |	/* Find the most restrictive of all the hints available to us.
  304|       |	 *
  305|       |	 * We have tried to be smarter about this in the past -- for example,
  306|       |	 * detecting all ANY inputs and ignoring the hint in this case, but
  307|       |	 * there are inevitably odd cases which cause problems. For example,
  308|       |	 * new_from_memory, resize, affine, write_to_memory would run with
  309|       |	 * FATSTRIP.
  310|       |	 */
  311|   195k|	set_hint = hint;
  312|   359k|	for (i = 0; i < len; i++)
  ------------------
  |  Branch (312:14): [True: 163k, False: 195k]
  ------------------
  313|   163k|		set_hint = (VipsDemandStyle) VIPS_MIN(
  ------------------
  |  |   55|   163k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 8.75k, False: 155k]
  |  |  ------------------
  ------------------
  314|   195k|			(int) set_hint, (int) in[i]->dhint);
  315|       |
  316|   195k|	image->dhint = set_hint;
  317|       |
  318|       |#ifdef DEBUG
  319|       |	printf("vips_image_pipeline_array: set dhint for \"%s\" to %s\n",
  320|       |		image->filename,
  321|       |		vips_enum_nick(VIPS_TYPE_DEMAND_STYLE, image->dhint));
  322|       |	printf("\toperation requested %s\n",
  323|       |		vips_enum_nick(VIPS_TYPE_DEMAND_STYLE, hint));
  324|       |	printf("\tinputs were:\n");
  325|       |	printf("\t");
  326|       |	for (i = 0; in[i]; i++)
  327|       |		printf("%s ", vips_enum_nick(VIPS_TYPE_DEMAND_STYLE, in[i]->dhint));
  328|       |	printf("\n");
  329|       |#endif /*DEBUG*/
  330|       |
  331|       |	/* im depends on all these ims.
  332|       |	 */
  333|   195k|	g_mutex_lock(&vips__global_lock);
  334|   359k|	for (i = 0; i < len; i++)
  ------------------
  |  Branch (334:14): [True: 163k, False: 195k]
  ------------------
  335|   163k|		vips__link_make(in[i], image);
  336|   195k|	g_mutex_unlock(&vips__global_lock);
  337|       |
  338|       |	/* Set a flag on the image to say we remembered to call this thing.
  339|       |	 * vips_image_generate() and friends check this.
  340|       |	 */
  341|   195k|	image->hint_set = TRUE;
  ------------------
  |  |  798|   195k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   195k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  342|   195k|}
vips_image_pipeline_array:
  379|   195k|{
  380|       |	/* This function can be called more than once per output image. For
  381|       |	 * example, jpeg header load will call this once on ->out to set the
  382|       |	 * default hint, then later call it again to connect the output image
  383|       |	 * up to the real image.
  384|       |	 *
  385|       |	 * It's only ever called first time with in[0] == NULL and second time
  386|       |	 * with a real value for @in.
  387|       |	 */
  388|   195k|	vips__demand_hint_array(image, hint, in);
  389|       |
  390|   195k|	if (in[0] &&
  ------------------
  |  Branch (390:6): [True: 159k, False: 36.2k]
  ------------------
  391|   195k|		vips__image_copy_fields_array(image, in))
  ------------------
  |  Branch (391:3): [True: 0, False: 159k]
  ------------------
  392|      0|		return -1;
  393|       |
  394|   195k|	if (vips__reorder_set_input(image, in))
  ------------------
  |  Branch (394:6): [True: 0, False: 195k]
  ------------------
  395|      0|		return -1;
  396|       |
  397|   195k|	return 0;
  398|   195k|}
vips_image_pipelinev:
  412|   173k|{
  413|   173k|	va_list ap;
  414|   173k|	int i;
  415|   173k|	VipsImage *ar[MAX_IMAGES];
  416|       |
  417|   173k|	va_start(ap, hint);
  418|   309k|	for (i = 0; i < MAX_IMAGES &&
  ------------------
  |  |  128|   619k|#define MAX_IMAGES (1000)
  ------------------
  |  Branch (418:14): [True: 309k, False: 0]
  ------------------
  419|   309k|		 (ar[i] = va_arg(ap, VipsImage *));
  ------------------
  |  Branch (419:4): [True: 136k, False: 173k]
  ------------------
  420|   173k|		 i++)
  421|   136k|		;
  422|   173k|	va_end(ap);
  423|   173k|	if (i == MAX_IMAGES) {
  ------------------
  |  |  128|   173k|#define MAX_IMAGES (1000)
  ------------------
  |  Branch (423:6): [True: 0, False: 173k]
  ------------------
  424|      0|		g_warning("%s", _("too many images"));
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  425|       |
  426|       |		/* Make sure we have a sentinel there.
  427|       |		 */
  428|      0|		ar[i - 1] = NULL;
  429|      0|	}
  430|       |
  431|   173k|	return vips_image_pipeline_array(image, hint, ar);
  432|   173k|}
vips_start_one:
  446|   133k|{
  447|   133k|	VipsImage *in = (VipsImage *) a;
  448|       |
  449|   133k|	return vips_region_new(in);
  450|   133k|}
vips_stop_one:
  464|   140k|{
  465|   140k|	VipsRegion *reg = (VipsRegion *) seq;
  466|       |
  467|   140k|	g_object_unref(reg);
  468|       |
  469|   140k|	return 0;
  470|   140k|}
vips_stop_many:
  485|    746|{
  486|    746|	VipsRegion **ar = (VipsRegion **) seq;
  487|       |
  488|    746|	if (ar) {
  ------------------
  |  Branch (488:6): [True: 746, False: 0]
  ------------------
  489|    746|		int i;
  490|       |
  491|  1.49k|		for (i = 0; ar[i]; i++)
  ------------------
  |  Branch (491:15): [True: 746, False: 746]
  ------------------
  492|    746|			g_object_unref(ar[i]);
  493|    746|		g_free((char *) ar);
  494|    746|	}
  495|       |
  496|    746|	return 0;
  497|    746|}
vips_start_many:
  512|    746|{
  513|    746|	VipsImage **in = (VipsImage **) a;
  514|       |
  515|    746|	int i, n;
  516|    746|	VipsRegion **ar;
  517|       |
  518|       |	/* How many images?
  519|       |	 */
  520|  1.49k|	for (n = 0; in[n]; n++)
  ------------------
  |  Branch (520:14): [True: 746, False: 746]
  ------------------
  521|    746|		;
  522|       |
  523|       |	/* Allocate space for region array.
  524|       |	 */
  525|    746|	if (!(ar = VIPS_ARRAY(NULL, n + 1, VipsRegion *)))
  ------------------
  |  |   72|    746|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    746|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    746|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    746|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    746|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (525:6): [True: 0, False: 746]
  ------------------
  526|      0|		return NULL;
  527|       |
  528|       |	/* Create a set of regions.
  529|       |	 */
  530|  1.49k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (530:14): [True: 746, False: 746]
  ------------------
  531|    746|		if (!(ar[i] = vips_region_new(in[i]))) {
  ------------------
  |  Branch (531:7): [True: 0, False: 746]
  ------------------
  532|      0|			vips_stop_many(ar, NULL, NULL);
  533|      0|			return NULL;
  534|      0|		}
  535|    746|	ar[n] = NULL;
  536|       |
  537|    746|	return ar;
  538|    746|}
vips_image_generate:
  686|   176k|{
  687|   176k|	int res;
  688|       |
  689|   176k|	VIPS_DEBUG_MSG("vips_image_generate: %p\n", image);
  ------------------
  |  |   47|   176k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   176k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   176k|	{ \
  |  |   49|   176k|		; \
  |  |   50|   176k|	} \
  |  |   51|   176k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   176k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  690|       |
  691|   176k|	g_assert(generate_fn);
  ------------------
  |  |  166|   176k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   176k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   176k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  692|   176k|	g_assert(vips_object_sanity(VIPS_OBJECT(image)));
  ------------------
  |  |  166|   176k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   176k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   176k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  693|       |
  694|   176k|	if (!image->hint_set) {
  ------------------
  |  Branch (694:6): [True: 0, False: 176k]
  ------------------
  695|      0|		vips_error("vips_image_generate",
  696|      0|			"%s", _("demand hint not set"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  697|      0|		return -1;
  698|      0|	}
  699|       |
  700|       |	/* We don't use this, but make sure it's set in case any old binaries
  701|       |	 * are expecting it.
  702|       |	 */
  703|   176k|	image->Bbits = vips_format_sizeof(image->BandFmt) << 3;
  704|       |
  705|       |	/* Look at output type to decide our action.
  706|       |	 */
  707|   176k|	switch (image->dtype) {
  708|   158k|	case VIPS_IMAGE_PARTIAL:
  ------------------
  |  Branch (708:2): [True: 158k, False: 17.5k]
  ------------------
  709|       |		/* Output to partial image. Just attach functions and return.
  710|       |		 */
  711|   158k|		if (image->generate_fn ||
  ------------------
  |  Branch (711:7): [True: 0, False: 158k]
  ------------------
  712|   158k|			image->start_fn ||
  ------------------
  |  Branch (712:4): [True: 0, False: 158k]
  ------------------
  713|   158k|			image->stop_fn) {
  ------------------
  |  Branch (713:4): [True: 0, False: 158k]
  ------------------
  714|      0|			vips_error("VipsImage",
  715|      0|				"%s", _("generate() called twice"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  716|      0|			return -1;
  717|      0|		}
  718|       |
  719|   158k|		image->start_fn = start_fn;
  720|   158k|		image->generate_fn = generate_fn;
  721|   158k|		image->stop_fn = stop_fn;
  722|   158k|		image->client1 = a;
  723|   158k|		image->client2 = b;
  724|       |
  725|   158k|		VIPS_DEBUG_MSG("vips_image_generate: "
  ------------------
  |  |   47|   158k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   158k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   158k|	{ \
  |  |   49|   158k|		; \
  |  |   50|   158k|	} \
  |  |   51|   158k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   158k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  726|   158k|					   "attaching partial callbacks\n");
  727|       |
  728|   158k|		if (vips_image_written(image))
  ------------------
  |  Branch (728:7): [True: 0, False: 158k]
  ------------------
  729|      0|			return -1;
  730|       |
  731|   158k|		break;
  732|       |
  733|   158k|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (733:2): [True: 17.5k, False: 158k]
  ------------------
  734|  17.5k|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (734:2): [True: 0, False: 176k]
  ------------------
  735|  17.5k|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (735:2): [True: 0, False: 176k]
  ------------------
  736|  17.5k|	case VIPS_IMAGE_OPENOUT:
  ------------------
  |  Branch (736:2): [True: 0, False: 176k]
  ------------------
  737|       |		/* Eval now .. sanity check.
  738|       |		 */
  739|  17.5k|		if (image->generate_fn ||
  ------------------
  |  Branch (739:7): [True: 0, False: 17.5k]
  ------------------
  740|  17.5k|			image->start_fn ||
  ------------------
  |  Branch (740:4): [True: 0, False: 17.5k]
  ------------------
  741|  17.5k|			image->stop_fn) {
  ------------------
  |  Branch (741:4): [True: 0, False: 17.5k]
  ------------------
  742|      0|			vips_error("VipsImage",
  743|      0|				"%s", _("generate() called twice"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  744|      0|			return -1;
  745|      0|		}
  746|       |
  747|       |		/* Attach callbacks.
  748|       |		 */
  749|  17.5k|		image->start_fn = start_fn;
  750|  17.5k|		image->generate_fn = generate_fn;
  751|  17.5k|		image->stop_fn = stop_fn;
  752|  17.5k|		image->client1 = a;
  753|  17.5k|		image->client2 = b;
  754|       |
  755|  17.5k|		if (vips_image_write_prepare(image))
  ------------------
  |  Branch (755:7): [True: 0, False: 17.5k]
  ------------------
  756|      0|			return -1;
  757|       |
  758|  17.5k|		if (image->dtype == VIPS_IMAGE_OPENOUT)
  ------------------
  |  Branch (758:7): [True: 0, False: 17.5k]
  ------------------
  759|      0|			res = vips_sink_disc(image, write_vips, NULL);
  760|  17.5k|		else
  761|  17.5k|			res = vips_sink_memory(image);
  762|       |
  763|       |		/* Error?
  764|       |		 */
  765|  17.5k|		if (res)
  ------------------
  |  Branch (765:7): [True: 5.52k, False: 11.9k]
  ------------------
  766|  5.52k|			return -1;
  767|       |
  768|       |		/* Must come before we rewind.
  769|       |		 */
  770|  11.9k|		if (vips_image_written(image))
  ------------------
  |  Branch (770:7): [True: 0, False: 11.9k]
  ------------------
  771|      0|			return -1;
  772|       |
  773|       |		/* We've written to image ... rewind it ready for reading.
  774|       |		 */
  775|  11.9k|		if (vips_image_pio_input(image))
  ------------------
  |  Branch (775:7): [True: 0, False: 11.9k]
  ------------------
  776|      0|			return -1;
  777|       |
  778|  11.9k|		break;
  779|       |
  780|  11.9k|	default:
  ------------------
  |  Branch (780:2): [True: 0, False: 176k]
  ------------------
  781|       |		/* Not a known output style.
  782|       |		 */
  783|      0|		vips_error("VipsImage",
  784|      0|			_("unable to output to a %s image"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  785|      0|			vips_enum_nick(VIPS_TYPE_IMAGE_TYPE,
  ------------------
  |  |  139|      0|#define VIPS_TYPE_IMAGE_TYPE (vips_image_type_get_type())
  ------------------
  786|      0|				image->dtype));
  787|      0|		return -1;
  788|   176k|	}
  789|       |
  790|   170k|	return 0;
  791|   176k|}
generate.c:vips__link_break:
  152|   163k|{
  153|   163k|	g_assert(image_up);
  ------------------
  |  |  166|   163k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   163k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   163k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  154|   163k|	g_assert(image_down);
  ------------------
  |  |  166|   163k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   163k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   163k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  155|       |
  156|   163k|	g_assert(g_slist_find(image_up->downstream, image_down));
  ------------------
  |  |  166|   163k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   163k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   163k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  157|   163k|	g_assert(g_slist_find(image_down->upstream, image_up));
  ------------------
  |  |  166|   163k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   163k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   163k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  158|       |
  159|   163k|	image_up->downstream =
  160|   163k|		g_slist_remove(image_up->downstream, image_down);
  161|   163k|	image_down->upstream =
  162|   163k|		g_slist_remove(image_down->upstream, image_up);
  163|       |
  164|       |	/* Unlink the progress chain.
  165|       |	 */
  166|   163k|	if (image_down->progress_signal &&
  ------------------
  |  Branch (166:6): [True: 13.6k, False: 150k]
  ------------------
  167|   163k|		image_down->progress_signal == image_up->progress_signal)
  ------------------
  |  Branch (167:3): [True: 4.08k, False: 9.60k]
  ------------------
  168|  4.08k|		image_down->progress_signal = NULL;
  169|       |
  170|   163k|	return NULL;
  171|   163k|}
generate.c:vips__link_break_rev:
  175|  63.2k|{
  176|  63.2k|	return vips__link_break(image_up, image_down, b);
  177|  63.2k|}
generate.c:vips__link_map_cb:
  227|   583k|{
  228|   583k|	*images = g_slist_prepend(*images, image);
  229|       |
  230|   583k|	return NULL;
  231|   583k|}
generate.c:vips__link_mapp:
  207|   605k|{
  208|   605k|	void *res;
  209|       |
  210|       |	/* Loop?
  211|       |	 */
  212|   605k|	if (image->serial == map->serial)
  ------------------
  |  Branch (212:6): [True: 22.3k, False: 583k]
  ------------------
  213|  22.3k|		return NULL;
  214|   583k|	image->serial = map->serial;
  215|       |
  216|   583k|	if ((res = map->fn(image, map->a, map->b)))
  ------------------
  |  Branch (216:6): [True: 0, False: 583k]
  ------------------
  217|      0|		return res;
  218|       |
  219|   583k|	return vips_slist_map2(map->upstream
  ------------------
  |  Branch (219:25): [True: 583k, False: 0]
  ------------------
  220|   583k|			? image->upstream
  221|   583k|			: image->downstream,
  222|   583k|		(VipsSListMap2Fn) vips__link_mapp, map, NULL);
  223|   583k|}
generate.c:vips__link_make:
  134|   163k|{
  135|   163k|	g_assert(image_up);
  ------------------
  |  |  166|   163k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   163k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   163k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  136|   163k|	g_assert(image_down);
  ------------------
  |  |  166|   163k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   163k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   163k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  137|       |
  138|   163k|	image_up->downstream =
  139|   163k|		g_slist_prepend(image_up->downstream, image_down);
  140|   163k|	image_down->upstream =
  141|   163k|		g_slist_prepend(image_down->upstream, image_up);
  142|       |
  143|       |	/* Propagate the progress indicator.
  144|       |	 */
  145|   163k|	if (image_up->progress_signal &&
  ------------------
  |  Branch (145:6): [True: 4.08k, False: 159k]
  ------------------
  146|   163k|		!image_down->progress_signal)
  ------------------
  |  Branch (146:3): [True: 4.08k, False: 0]
  ------------------
  147|  4.08k|		image_down->progress_signal = image_up->progress_signal;
  148|   163k|}

vips_format_sizeof:
  212|   196k|{
  213|   196k|	format = VIPS_CLIP(0, format, VIPS_FORMAT_DPCOMPLEX);
  ------------------
  |  |   57|   196k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|   392k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 196k]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 196k]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 196k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  214|       |
  215|   196k|	return vips__image_sizeof_bandformat[format];
  216|   196k|}
vips_format_sizeof_unsafe:
  229|  5.00M|{
  230|  5.00M|	g_assert(0 <= format && format <= VIPS_FORMAT_DPCOMPLEX);
  ------------------
  |  |  166|  5.00M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.00M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.00M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|       |
  232|  5.00M|	return vips__image_sizeof_bandformat[format];
  233|  5.00M|}
vips_interpretation_max_alpha:
  243|  9.31k|{
  244|  9.31k|	switch (interpretation) {
  245|     47|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (245:2): [True: 47, False: 9.27k]
  ------------------
  246|    512|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (246:2): [True: 465, False: 8.85k]
  ------------------
  247|    512|		return 65535.0;
  248|      0|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (248:2): [True: 0, False: 9.31k]
  ------------------
  249|      0|		return 1.0;
  250|  8.80k|	default:
  ------------------
  |  Branch (250:2): [True: 8.80k, False: 512]
  ------------------
  251|  8.80k|		return 255.0;
  252|  9.31k|	}
  253|  9.31k|}
vips__meta_destroy:
  375|   192k|{
  376|   192k|	VIPS_FREEF(g_hash_table_destroy, image->meta);
  ------------------
  |  |   41|   192k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   192k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   192k|	{ \
  |  |   43|   192k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 142k, False: 50.7k]
  |  |  ------------------
  |  |   44|   142k|			(void) F((S)); \
  |  |   45|   142k|			(S) = 0; \
  |  |   46|   142k|		} \
  |  |   47|   192k|	} \
  |  |   48|   192k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   192k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  377|   192k|	g_assert(!image->meta_traverse);
  ------------------
  |  |  166|   192k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   192k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   192k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  378|   192k|}
vips_image_get_format:
  434|  14.8k|{
  435|  14.8k|	return image->BandFmt;
  436|  14.8k|}
vips_image_guess_format:
  492|     39|{
  493|     39|	VipsBandFormat format;
  494|       |
  495|       |	/* Stop a compiler warning.
  496|       |	 */
  497|     39|	format = VIPS_FORMAT_UCHAR;
  498|       |
  499|     39|	switch (image->Type) {
  500|      0|	case VIPS_INTERPRETATION_B_W:
  ------------------
  |  Branch (500:2): [True: 0, False: 39]
  ------------------
  501|      0|	case VIPS_INTERPRETATION_HISTOGRAM:
  ------------------
  |  Branch (501:2): [True: 0, False: 39]
  ------------------
  502|      0|	case VIPS_INTERPRETATION_MULTIBAND:
  ------------------
  |  Branch (502:2): [True: 0, False: 39]
  ------------------
  503|      0|		format = image->BandFmt;
  504|      0|		break;
  505|       |
  506|      0|	case VIPS_INTERPRETATION_FOURIER:
  ------------------
  |  Branch (506:2): [True: 0, False: 39]
  ------------------
  507|      0|		if (image->BandFmt == VIPS_FORMAT_DOUBLE ||
  ------------------
  |  Branch (507:7): [True: 0, False: 0]
  ------------------
  508|      0|			image->BandFmt == VIPS_FORMAT_DPCOMPLEX)
  ------------------
  |  Branch (508:4): [True: 0, False: 0]
  ------------------
  509|      0|			format = VIPS_FORMAT_DPCOMPLEX;
  510|      0|		else
  511|      0|			format = VIPS_FORMAT_COMPLEX;
  512|      0|		break;
  513|       |
  514|      0|	case VIPS_INTERPRETATION_sRGB:
  ------------------
  |  Branch (514:2): [True: 0, False: 39]
  ------------------
  515|      0|	case VIPS_INTERPRETATION_RGB:
  ------------------
  |  Branch (515:2): [True: 0, False: 39]
  ------------------
  516|      0|		format = VIPS_FORMAT_UCHAR;
  517|      0|		break;
  518|       |
  519|      0|	case VIPS_INTERPRETATION_XYZ:
  ------------------
  |  Branch (519:2): [True: 0, False: 39]
  ------------------
  520|      0|	case VIPS_INTERPRETATION_LAB:
  ------------------
  |  Branch (520:2): [True: 0, False: 39]
  ------------------
  521|      0|	case VIPS_INTERPRETATION_CMC:
  ------------------
  |  Branch (521:2): [True: 0, False: 39]
  ------------------
  522|      0|	case VIPS_INTERPRETATION_LCH:
  ------------------
  |  Branch (522:2): [True: 0, False: 39]
  ------------------
  523|      0|	case VIPS_INTERPRETATION_HSV:
  ------------------
  |  Branch (523:2): [True: 0, False: 39]
  ------------------
  524|      0|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (524:2): [True: 0, False: 39]
  ------------------
  525|      0|	case VIPS_INTERPRETATION_YXY:
  ------------------
  |  Branch (525:2): [True: 0, False: 39]
  ------------------
  526|      0|		format = VIPS_FORMAT_FLOAT;
  527|      0|		break;
  528|       |
  529|      0|	case VIPS_INTERPRETATION_CMYK:
  ------------------
  |  Branch (529:2): [True: 0, False: 39]
  ------------------
  530|      0|		if (image->BandFmt == VIPS_FORMAT_USHORT)
  ------------------
  |  Branch (530:7): [True: 0, False: 0]
  ------------------
  531|      0|			format = VIPS_FORMAT_USHORT;
  532|      0|		else
  533|      0|			format = VIPS_FORMAT_UCHAR;
  534|      0|		break;
  535|       |
  536|      0|	case VIPS_INTERPRETATION_LABQ:
  ------------------
  |  Branch (536:2): [True: 0, False: 39]
  ------------------
  537|      0|		format = VIPS_FORMAT_UCHAR;
  538|      0|		break;
  539|       |
  540|      0|	case VIPS_INTERPRETATION_LABS:
  ------------------
  |  Branch (540:2): [True: 0, False: 39]
  ------------------
  541|      0|		format = VIPS_FORMAT_SHORT;
  542|      0|		break;
  543|       |
  544|      0|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (544:2): [True: 0, False: 39]
  ------------------
  545|     39|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (545:2): [True: 39, False: 0]
  ------------------
  546|     39|		format = VIPS_FORMAT_USHORT;
  547|     39|		break;
  548|       |
  549|      0|	case VIPS_INTERPRETATION_MATRIX:
  ------------------
  |  Branch (549:2): [True: 0, False: 39]
  ------------------
  550|      0|		if (image->BandFmt == VIPS_FORMAT_DOUBLE)
  ------------------
  |  Branch (550:7): [True: 0, False: 0]
  ------------------
  551|      0|			format = VIPS_FORMAT_DOUBLE;
  552|      0|		else
  553|      0|			format = VIPS_FORMAT_FLOAT;
  554|      0|		break;
  555|       |
  556|      0|	default:
  ------------------
  |  Branch (556:2): [True: 0, False: 39]
  ------------------
  557|      0|		format = VIPS_FORMAT_NOTSET;
  558|      0|		break;
  559|     39|	}
  560|       |
  561|     39|	return format;
  562|     39|}
vips_image_get_interpretation:
  587|  3.70k|{
  588|  3.70k|	return image->Type;
  589|  3.70k|}
vips_image_guess_interpretation:
  674|  4.43k|{
  675|  4.43k|	gboolean sane;
  676|       |
  677|  4.43k|	sane = TRUE;
  ------------------
  |  |  798|  4.43k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  4.43k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  678|       |
  679|       |	/* Coding overrides interpretation.
  680|       |	 */
  681|  4.43k|	switch (image->Coding) {
  682|      0|	case VIPS_CODING_ERROR:
  ------------------
  |  Branch (682:2): [True: 0, False: 4.43k]
  ------------------
  683|      0|		sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  684|      0|		break;
  685|       |
  686|      0|	case VIPS_CODING_LABQ:
  ------------------
  |  Branch (686:2): [True: 0, False: 4.43k]
  ------------------
  687|      0|		if (image->Type != VIPS_INTERPRETATION_LABQ)
  ------------------
  |  Branch (687:7): [True: 0, False: 0]
  ------------------
  688|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  689|      0|		break;
  690|       |
  691|      0|	case VIPS_CODING_RAD:
  ------------------
  |  Branch (691:2): [True: 0, False: 4.43k]
  ------------------
  692|      0|		if (image->Type != VIPS_INTERPRETATION_sRGB)
  ------------------
  |  Branch (692:7): [True: 0, False: 0]
  ------------------
  693|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  694|      0|		break;
  695|       |
  696|  4.43k|	default:
  ------------------
  |  Branch (696:2): [True: 4.43k, False: 0]
  ------------------
  697|  4.43k|		break;
  698|  4.43k|	}
  699|       |
  700|  4.43k|	switch (image->Type) {
  701|      0|	case VIPS_INTERPRETATION_ERROR:
  ------------------
  |  Branch (701:2): [True: 0, False: 4.43k]
  ------------------
  702|      0|		sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  703|      0|		break;
  704|       |
  705|    692|	case VIPS_INTERPRETATION_MULTIBAND:
  ------------------
  |  Branch (705:2): [True: 692, False: 3.74k]
  ------------------
  706|       |		/* This is a pretty useless generic tag. Always reset it.
  707|       |		 */
  708|    692|		sane = FALSE;
  ------------------
  |  |  794|    692|#define	FALSE	(0)
  ------------------
  709|    692|		break;
  710|       |
  711|  1.76k|	case VIPS_INTERPRETATION_B_W:
  ------------------
  |  Branch (711:2): [True: 1.76k, False: 2.66k]
  ------------------
  712|       |		/* Don't test bands, we allow bands after the first to be
  713|       |		 * unused extras, like alpha.
  714|       |		 */
  715|  1.76k|		break;
  716|       |
  717|      0|	case VIPS_INTERPRETATION_HISTOGRAM:
  ------------------
  |  Branch (717:2): [True: 0, False: 4.43k]
  ------------------
  718|      0|		if (image->Xsize > 1 && image->Ysize > 1)
  ------------------
  |  Branch (718:7): [True: 0, False: 0]
  |  Branch (718:27): [True: 0, False: 0]
  ------------------
  719|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  720|      0|		break;
  721|       |
  722|      0|	case VIPS_INTERPRETATION_FOURIER:
  ------------------
  |  Branch (722:2): [True: 0, False: 4.43k]
  ------------------
  723|      0|		if (!vips_band_format_iscomplex(image->BandFmt))
  ------------------
  |  Branch (723:7): [True: 0, False: 0]
  ------------------
  724|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  725|      0|		break;
  726|       |
  727|  1.30k|	case VIPS_INTERPRETATION_XYZ:
  ------------------
  |  Branch (727:2): [True: 1.30k, False: 3.13k]
  ------------------
  728|  1.30k|	case VIPS_INTERPRETATION_LAB:
  ------------------
  |  Branch (728:2): [True: 4, False: 4.42k]
  ------------------
  729|  1.30k|	case VIPS_INTERPRETATION_RGB:
  ------------------
  |  Branch (729:2): [True: 0, False: 4.43k]
  ------------------
  730|  1.30k|	case VIPS_INTERPRETATION_CMC:
  ------------------
  |  Branch (730:2): [True: 0, False: 4.43k]
  ------------------
  731|  1.30k|	case VIPS_INTERPRETATION_LCH:
  ------------------
  |  Branch (731:2): [True: 0, False: 4.43k]
  ------------------
  732|  1.34k|	case VIPS_INTERPRETATION_sRGB:
  ------------------
  |  Branch (732:2): [True: 41, False: 4.39k]
  ------------------
  733|  1.34k|	case VIPS_INTERPRETATION_HSV:
  ------------------
  |  Branch (733:2): [True: 0, False: 4.43k]
  ------------------
  734|  1.34k|		if (image->Bands < 3)
  ------------------
  |  Branch (734:7): [True: 41, False: 1.30k]
  ------------------
  735|     41|			sane = FALSE;
  ------------------
  |  |  794|     41|#define	FALSE	(0)
  ------------------
  736|  1.34k|		break;
  737|       |
  738|    272|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (738:2): [True: 272, False: 4.16k]
  ------------------
  739|    272|	case VIPS_INTERPRETATION_YXY:
  ------------------
  |  Branch (739:2): [True: 0, False: 4.43k]
  ------------------
  740|       |		/* Need float values in 0 - 1.
  741|       |		 */
  742|    272|		if (!vips_band_format_isfloat(image->BandFmt) ||
  ------------------
  |  Branch (742:7): [True: 0, False: 272]
  ------------------
  743|    272|			image->Bands < 3)
  ------------------
  |  Branch (743:4): [True: 0, False: 272]
  ------------------
  744|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  745|    272|		break;
  746|       |
  747|      0|	case VIPS_INTERPRETATION_CMYK:
  ------------------
  |  Branch (747:2): [True: 0, False: 4.43k]
  ------------------
  748|      0|		if (image->Bands < 4)
  ------------------
  |  Branch (748:7): [True: 0, False: 0]
  ------------------
  749|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  750|      0|		break;
  751|       |
  752|      0|	case VIPS_INTERPRETATION_LABQ:
  ------------------
  |  Branch (752:2): [True: 0, False: 4.43k]
  ------------------
  753|      0|		if (image->Coding != VIPS_CODING_LABQ)
  ------------------
  |  Branch (753:7): [True: 0, False: 0]
  ------------------
  754|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  755|      0|		break;
  756|       |
  757|     86|	case VIPS_INTERPRETATION_LABS:
  ------------------
  |  Branch (757:2): [True: 86, False: 4.34k]
  ------------------
  758|       |		/* Needs to be able to express +/- 32767
  759|       |		 */
  760|     86|		if (vips_band_format_isuint(image->BandFmt) ||
  ------------------
  |  Branch (760:7): [True: 0, False: 86]
  ------------------
  761|     86|			vips_band_format_is8bit(image->BandFmt) ||
  ------------------
  |  Branch (761:4): [True: 0, False: 86]
  ------------------
  762|     86|			image->Bands < 3)
  ------------------
  |  Branch (762:4): [True: 0, False: 86]
  ------------------
  763|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  764|     86|		break;
  765|       |
  766|      0|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (766:2): [True: 0, False: 4.43k]
  ------------------
  767|      0|		if (vips_band_format_is8bit(image->BandFmt) ||
  ------------------
  |  Branch (767:7): [True: 0, False: 0]
  ------------------
  768|      0|			image->Bands < 3)
  ------------------
  |  Branch (768:4): [True: 0, False: 0]
  ------------------
  769|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  770|      0|		break;
  771|       |
  772|    267|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (772:2): [True: 267, False: 4.16k]
  ------------------
  773|    267|		if (vips_band_format_is8bit(image->BandFmt))
  ------------------
  |  Branch (773:7): [True: 0, False: 267]
  ------------------
  774|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  775|    267|		break;
  776|       |
  777|      0|	case VIPS_INTERPRETATION_MATRIX:
  ------------------
  |  Branch (777:2): [True: 0, False: 4.43k]
  ------------------
  778|      0|		if (image->Bands != 1)
  ------------------
  |  Branch (778:7): [True: 0, False: 0]
  ------------------
  779|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  780|      0|		break;
  781|       |
  782|      0|	default:
  ------------------
  |  Branch (782:2): [True: 0, False: 4.43k]
  ------------------
  783|      0|		g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  784|  4.43k|	}
  785|       |
  786|  4.43k|	if (sane)
  ------------------
  |  Branch (786:6): [True: 3.70k, False: 733]
  ------------------
  787|  3.70k|		return vips_image_get_interpretation(image);
  788|    733|	else
  789|    733|		return vips_image_default_interpretation(image);
  790|  4.43k|}
vips_image_get_page_height:
  921|  10.9k|{
  922|  10.9k|	int page_height;
  923|       |
  924|  10.9k|	if (vips_image_get_typeof(image, VIPS_META_PAGE_HEIGHT) &&
  ------------------
  |  |  158|  10.9k|#define VIPS_META_PAGE_HEIGHT "page-height"
  ------------------
  |  Branch (924:6): [True: 0, False: 10.9k]
  ------------------
  925|  10.9k|		!vips_image_get_int(image, VIPS_META_PAGE_HEIGHT,
  ------------------
  |  |  158|      0|#define VIPS_META_PAGE_HEIGHT "page-height"
  ------------------
  |  Branch (925:3): [True: 0, False: 0]
  ------------------
  926|      0|			&page_height) &&
  927|  10.9k|		page_height > 0 &&
  ------------------
  |  Branch (927:3): [True: 0, False: 0]
  ------------------
  928|  10.9k|		page_height < image->Ysize &&
  ------------------
  |  Branch (928:3): [True: 0, False: 0]
  ------------------
  929|  10.9k|		image->Ysize % page_height == 0)
  ------------------
  |  Branch (929:3): [True: 0, False: 0]
  ------------------
  930|      0|		return page_height;
  931|       |
  932|  10.9k|	return image->Ysize;
  933|  10.9k|}
vips_image_get_concurrency:
  972|  56.8k|{
  973|  56.8k|	int concurrency;
  974|       |
  975|  56.8k|	if (vips_image_get_typeof(image, VIPS_META_CONCURRENCY) &&
  ------------------
  |  |  179|  56.8k|#define VIPS_META_CONCURRENCY "concurrency"
  ------------------
  |  Branch (975:6): [True: 0, False: 56.8k]
  ------------------
  976|  56.8k|		!vips_image_get_int(image,
  ------------------
  |  Branch (976:3): [True: 0, False: 0]
  ------------------
  977|      0|			VIPS_META_CONCURRENCY, &concurrency) &&
  ------------------
  |  |  179|      0|#define VIPS_META_CONCURRENCY "concurrency"
  ------------------
  978|  56.8k|		concurrency >= 1 &&
  ------------------
  |  Branch (978:3): [True: 0, False: 0]
  ------------------
  979|  56.8k|		concurrency < 100)
  ------------------
  |  Branch (979:3): [True: 0, False: 0]
  ------------------
  980|      0|		return concurrency;
  981|       |
  982|  56.8k|	return default_concurrency;
  983|  56.8k|}
vips_image_init_fields:
 1100|  17.0k|{
 1101|  17.0k|	g_object_set(image,
 1102|  17.0k|		"width", xsize,
 1103|  17.0k|		"height", ysize,
 1104|  17.0k|		"bands", bands,
 1105|  17.0k|		"format", format,
 1106|  17.0k|		NULL);
 1107|       |
 1108|  17.0k|	image->Coding = coding;
 1109|  17.0k|	image->Type = interpretation;
 1110|  17.0k|	image->Xres = VIPS_MAX(0, xres);
  ------------------
  |  |   54|  17.0k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 17.0k]
  |  |  ------------------
  ------------------
 1111|  17.0k|	image->Yres = VIPS_MAX(0, yres);
  ------------------
  |  |   54|  17.0k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 17.0k]
  |  |  ------------------
  ------------------
 1112|  17.0k|}
vips__image_meta_copy:
 1141|   163k|{
 1142|   163k|	if (src->meta) {
  ------------------
  |  Branch (1142:6): [True: 117k, False: 46.2k]
  ------------------
 1143|       |		/* We lock with vips_image_set() to stop races in highly-
 1144|       |		 * threaded applications.
 1145|       |		 */
 1146|   117k|		g_mutex_lock(&vips__meta_lock);
 1147|   117k|		meta_init(dst);
 1148|   117k|		vips_slist_map2(src->meta_traverse,
 1149|   117k|			(VipsSListMap2Fn) meta_cp_field, dst, NULL);
 1150|   117k|		g_mutex_unlock(&vips__meta_lock);
 1151|   117k|	}
 1152|       |
 1153|   163k|	return 0;
 1154|   163k|}
vips__image_copy_fields_array:
 1161|   159k|{
 1162|   159k|	int i;
 1163|   159k|	int ni;
 1164|       |
 1165|   159k|	g_assert(in[0]);
  ------------------
  |  |  166|   159k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   159k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   159k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1166|       |
 1167|       |	/* Copy magic too, handy for knowing the original image's byte order.
 1168|       |	 */
 1169|   159k|	out->magic = in[0]->magic;
 1170|       |
 1171|   159k|	out->Xsize = in[0]->Xsize;
 1172|   159k|	out->Ysize = in[0]->Ysize;
 1173|   159k|	out->Bands = in[0]->Bands;
 1174|   159k|	out->Bbits = in[0]->Bbits;
 1175|   159k|	out->BandFmt = in[0]->BandFmt;
 1176|   159k|	out->Type = in[0]->Type;
 1177|   159k|	out->Coding = in[0]->Coding;
 1178|   159k|	out->Xres = in[0]->Xres;
 1179|   159k|	out->Yres = in[0]->Yres;
 1180|   159k|	out->Xoffset = in[0]->Xoffset;
 1181|   159k|	out->Yoffset = in[0]->Yoffset;
 1182|       |
 1183|       |	/* Count number of images.
 1184|       |	 */
 1185|   323k|	for (ni = 0; in[ni]; ni++)
  ------------------
  |  Branch (1185:15): [True: 163k, False: 159k]
  ------------------
 1186|   163k|		;
 1187|       |
 1188|       |	/* Need to copy last-to-first so that in0 meta will override any
 1189|       |	 * earlier meta.
 1190|       |	 *
 1191|       |	 * Don't destroy the meta on out. Things like foreign.c like setting
 1192|       |	 * image properties before calling a subclass loader, and those
 1193|       |	 * subclass loaders will sometimes write to an image.
 1194|       |	 */
 1195|   323k|	for (i = ni - 1; i >= 0; i--)
  ------------------
  |  Branch (1195:19): [True: 163k, False: 159k]
  ------------------
 1196|   163k|		if (vips__image_meta_copy(out, in[i]))
  ------------------
  |  Branch (1196:7): [True: 0, False: 163k]
  ------------------
 1197|      0|			return -1;
 1198|       |
 1199|       |	/* Merge hists first to last.
 1200|       |	 */
 1201|   323k|	for (i = 0; in[i]; i++)
  ------------------
  |  Branch (1201:14): [True: 163k, False: 159k]
  ------------------
 1202|   163k|		out->history_list = vips__gslist_gvalue_merge(
 1203|   163k|			out->history_list, in[i]->history_list);
 1204|       |
 1205|   159k|	return 0;
 1206|   159k|}
vips_image_set:
 1234|   284k|{
 1235|   284k|	g_assert(name);
  ------------------
  |  |  166|   284k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   284k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   284k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1236|   284k|	g_assert(value);
  ------------------
  |  |  166|   284k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   284k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   284k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1237|       |
 1238|       |	/* We lock between modifying metadata and copying metadata between
 1239|       |	 * images, see vips__image_meta_copy().
 1240|       |	 *
 1241|       |	 * This prevents modification of metadata by one thread racing with
 1242|       |	 * metadata copy on another -- this can lead to crashes in
 1243|       |	 * highly-threaded applications.
 1244|       |	 */
 1245|   284k|	g_mutex_lock(&vips__meta_lock);
 1246|   284k|	meta_init(image);
 1247|   284k|	(void) meta_new(image, name, value);
 1248|   284k|	g_mutex_unlock(&vips__meta_lock);
 1249|       |
 1250|       |	/* If we're setting an EXIF data block, we need to automatically expand
 1251|       |	 * out all the tags. This will set things like xres/yres too.
 1252|       |	 *
 1253|       |	 * We do this here rather than in meta_new() since we don't want to
 1254|       |	 * trigger on copy_fields.
 1255|       |	 */
 1256|   284k|	if (strcmp(name, VIPS_META_EXIF_NAME) == 0)
  ------------------
  |  |   46|   284k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (1256:6): [True: 11.9k, False: 272k]
  ------------------
 1257|  11.9k|		if (vips__exif_parse(image))
  ------------------
  |  Branch (1257:7): [True: 0, False: 11.9k]
  ------------------
 1258|      0|			g_warning("image_set: bad exif data");
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1259|       |
 1260|       |#ifdef DEBUG
 1261|       |	meta_sanity(image);
 1262|       |#endif /*DEBUG*/
 1263|   284k|}
vips_image_get:
 1337|   243k|{
 1338|   243k|	int i;
 1339|   243k|	VipsMeta *meta;
 1340|       |
 1341|   243k|	g_assert(name);
  ------------------
  |  |  166|   243k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   243k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   243k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1342|   243k|	g_assert(value_copy);
  ------------------
  |  |  166|   243k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   243k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   243k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1343|       |
 1344|  1.73M|	for (i = 0; i < VIPS_NUMBER(vips_header_fields); i++) {
  ------------------
  |  |   60|  1.73M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1344:14): [True: 1.69M, False: 45.8k]
  ------------------
 1345|  1.69M|		HeaderField *field = &vips_header_fields[i];
 1346|       |
 1347|  1.69M|		if (strcmp(field->name, name) == 0) {
  ------------------
  |  Branch (1347:7): [True: 197k, False: 1.49M]
  ------------------
 1348|   197k|			GType gtype = g_type_from_name(field->type);
 1349|       |
 1350|   197k|			g_value_init(value_copy, gtype);
 1351|   197k|			vips_set_value_from_pointer(value_copy,
 1352|   197k|				G_STRUCT_MEMBER_P(image, field->offset));
  ------------------
  |  |  840|   197k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  ------------------
 1353|       |
 1354|   197k|			return 0;
 1355|   197k|		}
 1356|  1.69M|	}
 1357|       |
 1358|   550k|	for (i = 0; i < VIPS_NUMBER(vips_header_fields_old); i++) {
  ------------------
  |  |   60|   550k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1358:14): [True: 504k, False: 45.8k]
  ------------------
 1359|   504k|		HeaderField *field = &vips_header_fields_old[i];
 1360|       |
 1361|   504k|		if (strcmp(field->name, name) == 0) {
  ------------------
  |  Branch (1361:7): [True: 0, False: 504k]
  ------------------
 1362|      0|			GType gtype = g_type_from_name(field->type);
 1363|       |
 1364|      0|			g_value_init(value_copy, gtype);
 1365|      0|			vips_set_value_from_pointer(value_copy,
 1366|      0|				G_STRUCT_MEMBER_P(image, field->offset));
  ------------------
  |  |  840|      0|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  ------------------
 1367|       |
 1368|      0|			return 0;
 1369|      0|		}
 1370|   504k|	}
 1371|       |
 1372|  45.8k|	if (image->meta &&
  ------------------
  |  Branch (1372:6): [True: 45.8k, False: 0]
  ------------------
 1373|  45.8k|		(meta = g_hash_table_lookup(image->meta, name))) {
  ------------------
  |  Branch (1373:3): [True: 45.8k, False: 0]
  ------------------
 1374|  45.8k|		g_value_init(value_copy, G_VALUE_TYPE(&meta->value));
  ------------------
  |  |   59|  45.8k|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
 1375|  45.8k|		g_value_copy(&meta->value, value_copy);
 1376|       |
 1377|  45.8k|		return 0;
 1378|  45.8k|	}
 1379|       |
 1380|      0|	vips_error("vips_image_get", _("field \"%s\" not found"), name);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1381|       |
 1382|      0|	return -1;
 1383|  45.8k|}
vips_image_get_typeof:
 1400|   243k|{
 1401|   243k|	int i;
 1402|   243k|	VipsMeta *meta;
 1403|       |
 1404|   243k|	g_assert(name);
  ------------------
  |  |  166|   243k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   243k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   243k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1405|       |
 1406|  2.92M|	for (i = 0; i < VIPS_NUMBER(vips_header_fields); i++) {
  ------------------
  |  |   60|  2.92M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1406:14): [True: 2.67M, False: 243k]
  ------------------
 1407|  2.67M|		HeaderField *field = &vips_header_fields[i];
 1408|       |
 1409|  2.67M|		if (strcmp(field->name, name) == 0)
  ------------------
  |  Branch (1409:7): [True: 0, False: 2.67M]
  ------------------
 1410|      0|			return g_type_from_name(field->type);
 1411|  2.67M|	}
 1412|       |
 1413|  2.92M|	for (i = 0; i < VIPS_NUMBER(vips_header_fields_old); i++) {
  ------------------
  |  |   60|  2.92M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1413:14): [True: 2.67M, False: 243k]
  ------------------
 1414|  2.67M|		HeaderField *field = &vips_header_fields_old[i];
 1415|       |
 1416|  2.67M|		if (strcmp(field->name, name) == 0)
  ------------------
  |  Branch (1416:7): [True: 0, False: 2.67M]
  ------------------
 1417|      0|			return g_type_from_name(field->type);
 1418|  2.67M|	}
 1419|       |
 1420|   243k|	if (image->meta &&
  ------------------
  |  Branch (1420:6): [True: 238k, False: 4.85k]
  ------------------
 1421|   243k|		(meta = g_hash_table_lookup(image->meta, name)))
  ------------------
  |  Branch (1421:3): [True: 37.9k, False: 200k]
  ------------------
 1422|  37.9k|		return G_VALUE_TYPE(&meta->value);
  ------------------
  |  |   59|  37.9k|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
 1423|       |
 1424|   243k|	VIPS_DEBUG_MSG("vips_image_get_typeof: unknown field %s\n", name);
  ------------------
  |  |   47|   205k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   205k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   205k|	{ \
  |  |   49|   205k|		; \
  |  |   50|   205k|	} \
  |  |   51|   243k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   243k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1425|       |
 1426|   205k|	return 0;
 1427|   243k|}
vips_image_remove:
 1443|  7.93k|{
 1444|  7.93k|	gboolean result;
 1445|       |
 1446|  7.93k|	result = FALSE;
  ------------------
  |  |  794|  7.93k|#define	FALSE	(0)
  ------------------
 1447|       |
 1448|  7.93k|	if (image->meta) {
  ------------------
  |  Branch (1448:6): [True: 4.40k, False: 3.52k]
  ------------------
 1449|       |		/* We lock between modifying metadata and copying metadata
 1450|       |		 * between images, see vips__image_meta_copy().
 1451|       |		 *
 1452|       |		 * This prevents modification of metadata by one thread
 1453|       |		 * racing with metadata copy on another -- this can lead to
 1454|       |		 * crashes in highly-threaded applications.
 1455|       |		 */
 1456|  4.40k|		g_mutex_lock(&vips__meta_lock);
 1457|  4.40k|		result = g_hash_table_remove(image->meta, name);
 1458|  4.40k|		g_mutex_unlock(&vips__meta_lock);
 1459|  4.40k|	}
 1460|       |
 1461|  7.93k|	return result;
 1462|  7.93k|}
vips_image_map:
 1506|  17.9k|{
 1507|  17.9k|	int i;
 1508|  17.9k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  17.9k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1509|  17.9k|	void *result;
 1510|       |
 1511|   215k|	for (i = 0; i < VIPS_NUMBER(vips_header_fields); i++) {
  ------------------
  |  |   60|   215k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1511:14): [True: 197k, False: 17.9k]
  ------------------
 1512|   197k|		HeaderField *field = &vips_header_fields[i];
 1513|       |
 1514|   197k|		(void) vips_image_get(image, field->name, &value);
 1515|   197k|		result = fn(image, field->name, &value, a);
 1516|   197k|		g_value_unset(&value);
 1517|       |
 1518|   197k|		if (result)
  ------------------
  |  Branch (1518:7): [True: 0, False: 197k]
  ------------------
 1519|      0|			return result;
 1520|   197k|	}
 1521|       |
 1522|  17.9k|	if (image->meta_traverse &&
  ------------------
  |  Branch (1522:6): [True: 14.4k, False: 3.52k]
  ------------------
 1523|  17.9k|		(result = vips_slist_map2(image->meta_traverse,
  ------------------
  |  Branch (1523:3): [True: 0, False: 14.4k]
  ------------------
 1524|  14.4k|			 (VipsSListMap2Fn) vips_image_map_fn, fn, a)))
 1525|      0|		return result;
 1526|       |
 1527|  17.9k|	return NULL;
 1528|  17.9k|}
vips_image_set_blob:
 1673|  12.8k|{
 1674|  12.8k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  12.8k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1675|       |
 1676|  12.8k|	g_value_init(&value, VIPS_TYPE_BLOB);
  ------------------
  |  |  177|  12.8k|#define VIPS_TYPE_BLOB (vips_blob_get_type())
  ------------------
 1677|  12.8k|	vips_value_set_blob(&value, free_fn, data, size);
 1678|  12.8k|	vips_image_set(image, name, &value);
 1679|  12.8k|	g_value_unset(&value);
 1680|  12.8k|}
vips_image_set_blob_copy:
 1697|  13.0k|{
 1698|  13.0k|	void *data_copy;
 1699|       |
 1700|       |	/* Cap at 100mb for sanity.
 1701|       |	 */
 1702|  13.0k|	if (!data ||
  ------------------
  |  Branch (1702:6): [True: 11.6k, False: 1.36k]
  ------------------
 1703|  13.0k|		length == 0 ||
  ------------------
  |  Branch (1703:3): [True: 0, False: 1.36k]
  ------------------
 1704|  13.0k|		length > 100 * 1024 * 1024)
  ------------------
  |  Branch (1704:3): [True: 0, False: 1.36k]
  ------------------
 1705|  11.6k|		return;
 1706|       |
 1707|       |	/* We add an extra, secret null byte at the end, just in case this blob
 1708|       |	 * is read as a C string. The libtiff reader attaches
 1709|       |	 * XMP XML as a blob, for example.
 1710|       |	 */
 1711|  1.36k|	if (!(data_copy = vips_malloc(NULL, length + 1)))
  ------------------
  |  Branch (1711:6): [True: 0, False: 1.36k]
  ------------------
 1712|      0|		return;
 1713|  1.36k|	memcpy(data_copy, data, length);
 1714|  1.36k|	((unsigned char *) data_copy)[length] = '\0';
 1715|       |
 1716|  1.36k|	vips_image_set_blob(image,
 1717|  1.36k|		name, (VipsCallbackFn) vips_area_free_cb, data_copy, length);
 1718|  1.36k|}
vips_image_get_blob:
 1738|  12.4k|{
 1739|  12.4k|	GValue value_copy = G_VALUE_INIT;
  ------------------
  |  |  191|  12.4k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1740|       |
 1741|  12.4k|	if (!meta_get_value(image, name, VIPS_TYPE_BLOB, &value_copy)) {
  ------------------
  |  |  177|  12.4k|#define VIPS_TYPE_BLOB (vips_blob_get_type())
  ------------------
  |  Branch (1741:6): [True: 12.4k, False: 0]
  ------------------
 1742|  12.4k|		*data = vips_value_get_blob(&value_copy, length);
 1743|  12.4k|		g_value_unset(&value_copy);
 1744|  12.4k|		return 0;
 1745|  12.4k|	}
 1746|       |
 1747|      0|	return -1;
 1748|  12.4k|}
vips_image_get_int:
 1766|  4.06k|{
 1767|  4.06k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  4.06k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1768|       |
 1769|  4.06k|	if (meta_get_value(image, name, G_TYPE_INT, &value))
  ------------------
  |  |   94|  4.06k|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|  4.06k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  4.06k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1769:6): [True: 0, False: 4.06k]
  ------------------
 1770|      0|		return -1;
 1771|  4.06k|	*out = g_value_get_int(&value);
 1772|  4.06k|	g_value_unset(&value);
 1773|       |
 1774|  4.06k|	return 0;
 1775|  4.06k|}
vips_image_set_int:
 1791|  84.2k|{
 1792|  84.2k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  84.2k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1793|       |
 1794|  84.2k|	g_value_init(&value, G_TYPE_INT);
  ------------------
  |  |   94|  84.2k|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|  84.2k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  84.2k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1795|  84.2k|	g_value_set_int(&value, i);
 1796|  84.2k|	vips_image_set(image, name, &value);
 1797|  84.2k|	g_value_unset(&value);
 1798|  84.2k|}
vips_image_set_double:
 1841|  2.90k|{
 1842|  2.90k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  2.90k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1843|       |
 1844|  2.90k|	g_value_init(&value, G_TYPE_DOUBLE);
  ------------------
  |  |  148|  2.90k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|  2.90k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  2.90k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1845|  2.90k|	g_value_set_double(&value, d);
 1846|  2.90k|	vips_image_set(image, name, &value);
 1847|  2.90k|	g_value_unset(&value);
 1848|  2.90k|}
vips_image_get_string:
 1871|  29.1k|{
 1872|  29.1k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  29.1k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1873|       |
 1874|  29.1k|	if (vips_image_get(image, name, &value))
  ------------------
  |  Branch (1874:6): [True: 0, False: 29.1k]
  ------------------
 1875|      0|		return -1;
 1876|       |
 1877|  29.1k|	if (G_VALUE_TYPE(&value) == VIPS_TYPE_REF_STRING) {
  ------------------
  |  |   59|  29.1k|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
              	if (G_VALUE_TYPE(&value) == VIPS_TYPE_REF_STRING) {
  ------------------
  |  |  159|  29.1k|#define VIPS_TYPE_REF_STRING (vips_ref_string_get_type())
  ------------------
  |  Branch (1877:6): [True: 29.1k, False: 0]
  ------------------
 1878|  29.1k|		VipsArea *area;
 1879|       |
 1880|  29.1k|		area = g_value_get_boxed(&value);
 1881|  29.1k|		*out = area->data;
 1882|  29.1k|	}
 1883|      0|	else if (G_VALUE_TYPE(&value) == G_TYPE_STRING) {
  ------------------
  |  |   59|      0|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
              	else if (G_VALUE_TYPE(&value) == G_TYPE_STRING) {
  ------------------
  |  |  154|      0|#define G_TYPE_STRING			G_TYPE_MAKE_FUNDAMENTAL (16)
  |  |  ------------------
  |  |  |  |  221|      0|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      0|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1883:11): [True: 0, False: 0]
  ------------------
 1884|      0|		*out = g_value_get_string(&value);
 1885|      0|	}
 1886|      0|	else {
 1887|      0|		vips_error("VipsImage",
 1888|      0|			_("field \"%s\" is of type %s, not VipsRefString"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1889|      0|			name,
 1890|      0|			g_type_name(G_VALUE_TYPE(&value)));
  ------------------
  |  |   59|      0|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
 1891|      0|		g_value_unset(&value);
 1892|       |
 1893|      0|		return -1;
 1894|      0|	}
 1895|       |
 1896|  29.1k|	g_value_unset(&value);
 1897|       |
 1898|  29.1k|	return 0;
 1899|  29.1k|}
vips_image_set_string:
 1915|   182k|{
 1916|   182k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|   182k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1917|       |
 1918|   182k|	g_value_init(&value, VIPS_TYPE_REF_STRING);
  ------------------
  |  |  159|   182k|#define VIPS_TYPE_REF_STRING (vips_ref_string_get_type())
  ------------------
 1919|   182k|	vips_value_set_ref_string(&value, str);
 1920|   182k|	vips_image_set(image, name, &value);
 1921|   182k|	g_value_unset(&value);
 1922|   182k|}
vips_image_get_array_int:
 2070|    173|{
 2071|    173|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|    173|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 2072|       |
 2073|    173|	if (meta_get_value(image, name, VIPS_TYPE_ARRAY_INT, &value))
  ------------------
  |  |  221|    173|#define VIPS_TYPE_ARRAY_INT (vips_array_int_get_type())
  ------------------
  |  Branch (2073:6): [True: 0, False: 173]
  ------------------
 2074|      0|		return -1;
 2075|    173|	*out = vips_value_get_array_int(&value, n);
 2076|    173|	g_value_unset(&value);
 2077|       |
 2078|    173|	return 0;
 2079|    173|}
vips_image_set_array_int:
 2096|    683|{
 2097|    683|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|    683|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 2098|       |
 2099|    683|	g_value_init(&value, VIPS_TYPE_ARRAY_INT);
  ------------------
  |  |  221|    683|#define VIPS_TYPE_ARRAY_INT (vips_array_int_get_type())
  ------------------
 2100|    683|	vips_value_set_array_int(&value, array, n);
 2101|    683|	vips_image_set(image, name, &value);
 2102|    683|	g_value_unset(&value);
 2103|    683|}
vips_image_set_array_double:
 2154|    367|{
 2155|    367|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|    367|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 2156|       |
 2157|    367|	g_value_init(&value, VIPS_TYPE_ARRAY_DOUBLE);
  ------------------
  |  |  201|    367|#define VIPS_TYPE_ARRAY_DOUBLE (vips_array_double_get_type())
  ------------------
 2158|    367|	vips_value_set_array_double(&value, array, n);
 2159|    367|	vips_image_set(image, name, &value);
 2160|    367|	g_value_unset(&value);
 2161|    367|}
header.c:vips_image_default_interpretation:
  595|    733|{
  596|    733|	switch (image->Coding) {
  597|      0|	case VIPS_CODING_LABQ:
  ------------------
  |  Branch (597:2): [True: 0, False: 733]
  ------------------
  598|      0|		return VIPS_INTERPRETATION_LABQ;
  599|      0|	case VIPS_CODING_RAD:
  ------------------
  |  Branch (599:2): [True: 0, False: 733]
  ------------------
  600|      0|		return VIPS_INTERPRETATION_sRGB;
  601|    733|	default:
  ------------------
  |  Branch (601:2): [True: 733, False: 0]
  ------------------
  602|    733|		break;
  603|    733|	}
  604|       |
  605|    733|	switch (image->BandFmt) {
  606|    153|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (606:2): [True: 153, False: 580]
  ------------------
  607|    224|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (607:2): [True: 71, False: 662]
  ------------------
  608|    362|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (608:2): [True: 138, False: 595]
  ------------------
  609|    477|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (609:2): [True: 115, False: 618]
  ------------------
  610|    603|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (610:2): [True: 126, False: 607]
  ------------------
  611|    603|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (611:2): [True: 0, False: 733]
  ------------------
  612|    603|		switch (image->Bands) {
  613|    192|		case 1:
  ------------------
  |  Branch (613:3): [True: 192, False: 411]
  ------------------
  614|    235|		case 2:
  ------------------
  |  Branch (614:3): [True: 43, False: 560]
  ------------------
  615|    235|			return VIPS_INTERPRETATION_B_W;
  616|       |
  617|    256|		case 3:
  ------------------
  |  Branch (617:3): [True: 256, False: 347]
  ------------------
  618|    368|		case 4:
  ------------------
  |  Branch (618:3): [True: 112, False: 491]
  ------------------
  619|       |			// we don't send float/double to scrgb, that's very likely to
  620|       |			// cause much more confusion, since "linear" makes float rgg all
  621|       |			// the time
  622|       |			//
  623|       |			// we do send u16 to rgb16/grey16 since that's a common case,
  624|       |			// see below
  625|    368|			return VIPS_INTERPRETATION_sRGB;
  626|       |
  627|      0|		default:
  ------------------
  |  Branch (627:3): [True: 0, False: 603]
  ------------------
  628|      0|			return VIPS_INTERPRETATION_MULTIBAND;
  629|    603|		}
  630|       |
  631|     34|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (631:2): [True: 34, False: 699]
  ------------------
  632|     34|		switch (image->Bands) {
  633|      2|		case 1:
  ------------------
  |  Branch (633:3): [True: 2, False: 32]
  ------------------
  634|      2|			return VIPS_INTERPRETATION_MATRIX;
  635|       |
  636|     32|		default:
  ------------------
  |  Branch (636:3): [True: 32, False: 2]
  ------------------
  637|     32|			return VIPS_INTERPRETATION_MULTIBAND;
  638|     34|		}
  639|       |
  640|     96|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (640:2): [True: 96, False: 637]
  ------------------
  641|     96|		switch (image->Bands) {
  642|      8|		case 1:
  ------------------
  |  Branch (642:3): [True: 8, False: 88]
  ------------------
  643|     10|		case 2:
  ------------------
  |  Branch (643:3): [True: 2, False: 94]
  ------------------
  644|     10|			return VIPS_INTERPRETATION_GREY16;
  645|       |
  646|     60|		case 3:
  ------------------
  |  Branch (646:3): [True: 60, False: 36]
  ------------------
  647|     86|		case 4:
  ------------------
  |  Branch (647:3): [True: 26, False: 70]
  ------------------
  648|     86|			return VIPS_INTERPRETATION_RGB16;
  649|       |
  650|      0|		default:
  ------------------
  |  Branch (650:3): [True: 0, False: 96]
  ------------------
  651|      0|			return VIPS_INTERPRETATION_MULTIBAND;
  652|     96|		}
  653|       |
  654|      0|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (654:2): [True: 0, False: 733]
  ------------------
  655|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (655:2): [True: 0, False: 733]
  ------------------
  656|      0|		return VIPS_INTERPRETATION_FOURIER;
  657|       |
  658|      0|	default:
  ------------------
  |  Branch (658:2): [True: 0, False: 733]
  ------------------
  659|      0|		return VIPS_INTERPRETATION_MULTIBAND;
  660|    733|	}
  661|    733|}
header.c:meta_init:
  382|   401k|{
  383|   401k|	if (!im->meta) {
  ------------------
  |  Branch (383:6): [True: 142k, False: 259k]
  ------------------
  384|   142k|		g_assert(!im->meta_traverse);
  ------------------
  |  |  166|   142k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   142k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   142k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  385|   142k|		im->meta = g_hash_table_new_full(g_str_hash, g_str_equal,
  386|   142k|			NULL, (GDestroyNotify) meta_free);
  387|   142k|	}
  388|   401k|}
header.c:meta_free:
  307|  1.20M|{
  308|       |#ifdef DEBUG
  309|       |	{
  310|       |		char *str_value;
  311|       |
  312|       |		str_value = g_strdup_value_contents(&meta->value);
  313|       |		printf("meta_free: name %s, value = %s\n",
  314|       |			meta->name, str_value);
  315|       |		g_free(str_value);
  316|       |	}
  317|       |#endif /*DEBUG*/
  318|       |
  319|  1.20M|	if (meta->im)
  ------------------
  |  Branch (319:6): [True: 1.20M, False: 0]
  ------------------
  320|  1.20M|		meta->im->meta_traverse =
  321|  1.20M|			g_slist_remove(meta->im->meta_traverse, meta);
  322|       |
  323|  1.20M|	g_value_unset(&meta->value);
  324|  1.20M|	g_free(meta->name);
  325|  1.20M|	g_free(meta);
  326|  1.20M|}
header.c:meta_cp_field:
 1116|   920k|{
 1117|       |#ifdef DEBUG
 1118|       |	{
 1119|       |		char *str_value;
 1120|       |
 1121|       |		str_value = g_strdup_value_contents(&meta->value);
 1122|       |		printf("vips__meta_cp: copying name %s, value = %s\n",
 1123|       |			meta->name, str_value);
 1124|       |		g_free(str_value);
 1125|       |	}
 1126|       |#endif /*DEBUG*/
 1127|       |
 1128|   920k|	(void) meta_new(dst, meta->name, &meta->value);
 1129|       |
 1130|       |#ifdef DEBUG
 1131|       |	meta_sanity(dst);
 1132|       |#endif /*DEBUG*/
 1133|       |
 1134|   920k|	return NULL;
 1135|   920k|}
header.c:meta_new:
  330|  1.20M|{
  331|  1.20M|	VipsMeta *meta;
  332|       |
  333|  1.20M|	meta = g_new(VipsMeta, 1);
  ------------------
  |  |  282|  1.20M|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  1.20M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  1.20M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  1.20M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  1.20M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  1.20M|	  gpointer __p;						\
  |  |  |  |  231|  1.20M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 1.20M]
  |  |  |  |  ------------------
  |  |  |  |  232|  1.20M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  1.20M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 1.20M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  1.20M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 1.20M]
  |  |  |  |  |  Branch (234:26): [True: 1.20M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  1.20M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  1.20M|	  else							\
  |  |  |  |  237|  1.20M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  1.20M|	  __p;							\
  |  |  |  |  239|  1.20M|	}))
  |  |  ------------------
  ------------------
  334|  1.20M|	meta->im = image;
  335|  1.20M|	meta->name = NULL;
  336|  1.20M|	memset(&meta->value, 0, sizeof(GValue));
  337|  1.20M|	meta->name = g_strdup(name);
  338|       |
  339|       |	/* Special case: we don't want to have G_STRING on meta. They will be
  340|       |	 * copied down pipelines, plus some of our API (like
  341|       |	 * vips_image_get_string()) assumes that the GValue is a refstring and
  342|       |	 * that read-only pointers can be handed out.
  343|       |	 *
  344|       |	 * Turn G_TYPE_STRING into VIPS_TYPE_REF_STRING.
  345|       |	 */
  346|  1.20M|	if (G_VALUE_TYPE(value) == G_TYPE_STRING)
  ------------------
  |  |   59|  1.20M|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
              	if (G_VALUE_TYPE(value) == G_TYPE_STRING)
  ------------------
  |  |  154|  1.20M|#define G_TYPE_STRING			G_TYPE_MAKE_FUNDAMENTAL (16)
  |  |  ------------------
  |  |  |  |  221|  1.20M|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  1.20M|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (346:6): [True: 0, False: 1.20M]
  ------------------
  347|      0|		g_value_init(&meta->value, VIPS_TYPE_REF_STRING);
  ------------------
  |  |  159|      0|#define VIPS_TYPE_REF_STRING (vips_ref_string_get_type())
  ------------------
  348|  1.20M|	else
  349|  1.20M|		g_value_init(&meta->value, G_VALUE_TYPE(value));
  ------------------
  |  |   59|  1.20M|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
  350|       |
  351|       |	/* We don't do any conversions that can fail.
  352|       |	 */
  353|  1.20M|	(void) g_value_transform(value, &meta->value);
  354|       |
  355|  1.20M|	image->meta_traverse = g_slist_append(image->meta_traverse, meta);
  356|  1.20M|	g_hash_table_replace(image->meta, meta->name, meta);
  357|       |
  358|       |#ifdef DEBUG
  359|       |	{
  360|       |		char *str_value;
  361|       |
  362|       |		str_value = g_strdup_value_contents(value);
  363|       |		printf("meta_new: name %s, value = %s\n", name, str_value);
  364|       |		g_free(str_value);
  365|       |	}
  366|       |#endif /*DEBUG*/
  367|       |
  368|  1.20M|	return meta;
  369|  1.20M|}
header.c:vips_set_value_from_pointer:
 1270|   197k|{
 1271|   197k|	GType type = G_VALUE_TYPE(value);
  ------------------
  |  |   59|   197k|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
 1272|       |
 1273|       |	/* The fundamental type ... eg. G_TYPE_ENUM for a VIPS_TYPE_KERNEL,
 1274|       |	 * or G_TYPE_OBJECT for VIPS_TYPE_IMAGE().
 1275|       |	 */
 1276|   197k|	GType fundamental = G_TYPE_FUNDAMENTAL(type);
  ------------------
  |  |   38|   197k|#define G_TYPE_FUNDAMENTAL(type)	(g_type_fundamental (type))
  ------------------
 1277|       |
 1278|   197k|	if (fundamental == G_TYPE_INT)
  ------------------
  |  |   94|   197k|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|   197k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|   197k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1278:6): [True: 89.9k, False: 107k]
  ------------------
 1279|  89.9k|		g_value_set_int(value, *((int *) data));
 1280|   107k|	else if (fundamental == G_TYPE_DOUBLE)
  ------------------
  |  |  148|   107k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|   107k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|   107k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1280:11): [True: 35.9k, False: 71.9k]
  ------------------
 1281|  35.9k|		g_value_set_double(value, *((double *) data));
 1282|  71.9k|	else if (fundamental == G_TYPE_ENUM)
  ------------------
  |  |  130|  71.9k|#define G_TYPE_ENUM			G_TYPE_MAKE_FUNDAMENTAL (12)
  |  |  ------------------
  |  |  |  |  221|  71.9k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  71.9k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1282:11): [True: 53.9k, False: 17.9k]
  ------------------
 1283|  53.9k|		g_value_set_enum(value, *((int *) data));
 1284|  17.9k|	else if (fundamental == G_TYPE_STRING)
  ------------------
  |  |  154|  17.9k|#define G_TYPE_STRING			G_TYPE_MAKE_FUNDAMENTAL (16)
  |  |  ------------------
  |  |  |  |  221|  17.9k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  17.9k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1284:11): [True: 17.9k, False: 0]
  ------------------
 1285|       |		// we don't want to copy the string (ie. the filename, usually) since
 1286|       |		// it'll then be freed when the value is unset ... instead we must
 1287|       |		// directly use the pointer owned by the VipsImage
 1288|  17.9k|		g_value_set_static_string(value, *((char **) data));
 1289|      0|	else
 1290|      0|		g_warning("%s: unimplemented vips_set_value_from_pointer() type %s",
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1291|   197k|			G_STRLOC,
 1292|   197k|			g_type_name(type));
 1293|   197k|}
header.c:vips_image_map_fn:
 1476|  63.7k|{
 1477|  63.7k|	int i;
 1478|       |
 1479|       |	/* Hide deprecated fields.
 1480|       |	 */
 1481|   377k|	for (i = 0; i < VIPS_NUMBER(vips_image_header_deprecated); i++)
  ------------------
  |  |   60|   377k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1481:14): [True: 317k, False: 59.6k]
  ------------------
 1482|   317k|		if (strcmp(meta->name, vips_image_header_deprecated[i]) == 0)
  ------------------
  |  Branch (1482:7): [True: 4.15k, False: 313k]
  ------------------
 1483|  4.15k|			return NULL;
 1484|       |
 1485|  59.6k|	return fn(meta->im, meta->name, &meta->value, a);
 1486|  63.7k|}
header.c:meta_get_value:
 1606|  16.7k|{
 1607|  16.7k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  16.7k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1608|       |
 1609|  16.7k|	if (vips_image_get(image, name, &value))
  ------------------
  |  Branch (1609:6): [True: 0, False: 16.7k]
  ------------------
 1610|      0|		return -1;
 1611|  16.7k|	g_value_init(value_copy, type);
 1612|  16.7k|	if (!g_value_transform(&value, value_copy)) {
  ------------------
  |  Branch (1612:6): [True: 0, False: 16.7k]
  ------------------
 1613|      0|		vips_error("VipsImage",
 1614|      0|			_("field \"%s\" is of type %s, not %s"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1615|      0|			name,
 1616|      0|			g_type_name(G_VALUE_TYPE(&value)),
  ------------------
  |  |   59|      0|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
 1617|      0|			g_type_name(type));
 1618|      0|		g_value_unset(&value);
 1619|       |
 1620|      0|		return -1;
 1621|      0|	}
 1622|  16.7k|	g_value_unset(&value);
 1623|       |
 1624|  16.7k|	return 0;
 1625|  16.7k|}

vips_image_written:
 1364|   170k|{
 1365|   170k|	int result;
 1366|       |
 1367|   170k|	VIPS_DEBUG_MSG("vips_image_written: %p\n", image);
  ------------------
  |  |   47|   170k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   170k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   170k|	{ \
  |  |   49|   170k|		; \
  |  |   50|   170k|	} \
  |  |   51|   170k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   170k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1368|       |
 1369|   170k|	result = 0;
 1370|   170k|	g_signal_emit(image, vips_image_signals[SIG_WRITTEN], 0, &result);
 1371|       |
 1372|   170k|	return result;
 1373|   170k|}
vips_image_minimise_all:
 1443|  56.8k|{
 1444|       |	/* Minimisation will modify things like sources, so we can't run it
 1445|       |	 * from many threads.
 1446|       |	 */
 1447|  56.8k|	g_mutex_lock(&vips__minimise_lock);
 1448|       |
 1449|  56.8k|	(void) vips__link_map(image, TRUE,
  ------------------
  |  |  798|  56.8k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  56.8k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1450|  56.8k|		(VipsSListMap2Fn) vips_image_minimise_all_cb, NULL, NULL);
 1451|       |
 1452|  56.8k|	g_mutex_unlock(&vips__minimise_lock);
 1453|  56.8k|}
vips_image_preeval:
 1524|  28.4k|{
 1525|  28.4k|	if (image->progress_signal) {
  ------------------
  |  Branch (1525:6): [True: 8.76k, False: 19.6k]
  ------------------
 1526|  8.76k|		VIPS_DEBUG_MSG("vips_image_preeval: %p\n", image);
  ------------------
  |  |   47|  8.76k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.76k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  8.76k|	{ \
  |  |   49|  8.76k|		; \
  |  |   50|  8.76k|	} \
  |  |   51|  8.76k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.76k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1527|       |
 1528|  8.76k|		g_assert(vips_object_sanity(
  ------------------
  |  |  166|  8.76k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  8.76k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.76k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1529|  8.76k|			VIPS_OBJECT(image->progress_signal)));
 1530|       |
 1531|  8.76k|		(void) vips_progress_add(image);
 1532|       |
 1533|       |		/* For vips7 compat, we also have to make sure ->time on the
 1534|       |		 * image that was originally marked with
 1535|       |		 * vips_image_set_progress() is valid.
 1536|       |		 */
 1537|  8.76k|		(void) vips_progress_add(image->progress_signal);
 1538|       |
 1539|  8.76k|		if (!vips_image_get_typeof(image, "hide-progress"))
  ------------------
  |  Branch (1539:7): [True: 8.76k, False: 0]
  ------------------
 1540|  8.76k|			g_signal_emit(image->progress_signal,
 1541|  8.76k|				vips_image_signals[SIG_PREEVAL], 0,
 1542|  8.76k|				image->time);
 1543|  8.76k|	}
 1544|  28.4k|}
vips_image_eval:
 1550|  19.9k|{
 1551|  19.9k|	if (image->progress_signal &&
  ------------------
  |  Branch (1551:6): [True: 7.08k, False: 12.8k]
  ------------------
 1552|  19.9k|		image->time) {
  ------------------
  |  Branch (1552:3): [True: 7.08k, False: 0]
  ------------------
 1553|  7.08k|		VIPS_DEBUG_MSG("vips_image_eval: %p\n", image);
  ------------------
  |  |   47|  7.08k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  7.08k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  7.08k|	{ \
  |  |   49|  7.08k|		; \
  |  |   50|  7.08k|	} \
  |  |   51|  7.08k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.08k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1554|       |
 1555|  7.08k|		g_assert(vips_object_sanity(
  ------------------
  |  |  166|  7.08k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  7.08k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.08k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1556|  7.08k|			VIPS_OBJECT(image->progress_signal)));
 1557|       |
 1558|  7.08k|		vips_progress_update(image->time, processed);
 1559|       |
 1560|       |		/* For vips7 compat, update the ->time on the signalling image
 1561|       |		 * too, even though it may have a different width/height to
 1562|       |		 * the image we are actually generating.
 1563|       |		 */
 1564|  7.08k|		if (image->progress_signal->time != image->time)
  ------------------
  |  Branch (1564:7): [True: 7.08k, False: 0]
  ------------------
 1565|  7.08k|			vips_progress_update(image->progress_signal->time,
 1566|  7.08k|				processed);
 1567|       |
 1568|  7.08k|		if (!vips_image_get_typeof(image, "hide-progress"))
  ------------------
  |  Branch (1568:7): [True: 7.08k, False: 0]
  ------------------
 1569|  7.08k|			g_signal_emit(image->progress_signal,
 1570|  7.08k|				vips_image_signals[SIG_EVAL], 0,
 1571|  7.08k|				image->time);
 1572|  7.08k|	}
 1573|  19.9k|}
vips_image_posteval:
 1577|  28.4k|{
 1578|  28.4k|	if (image->progress_signal &&
  ------------------
  |  Branch (1578:6): [True: 8.76k, False: 19.6k]
  ------------------
 1579|  28.4k|		image->progress_signal->time) {
  ------------------
  |  Branch (1579:3): [True: 8.76k, False: 0]
  ------------------
 1580|  8.76k|		gint64 processed;
 1581|       |
 1582|  8.76k|		VIPS_DEBUG_MSG("vips_image_posteval: %p\n", image);
  ------------------
  |  |   47|  8.76k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.76k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  8.76k|	{ \
  |  |   49|  8.76k|		; \
  |  |   50|  8.76k|	} \
  |  |   51|  8.76k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.76k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1583|       |
 1584|  8.76k|		g_assert(vips_object_sanity(
  ------------------
  |  |  166|  8.76k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  8.76k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.76k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1585|  8.76k|			VIPS_OBJECT(image->progress_signal)));
 1586|       |
 1587|       |		/* Make sure posteval sees a finished progress.
 1588|       |		 */
 1589|  8.76k|		processed = image->time->tpels;
 1590|  8.76k|		vips_progress_update(image->time, processed);
 1591|       |
 1592|       |		/* For vips7 compat, update the ->time on the signalling image
 1593|       |		 * too, even though it may have a different width/height to
 1594|       |		 * the image we are actually generating.
 1595|       |		 */
 1596|  8.76k|		if (image->progress_signal->time != image->time)
  ------------------
  |  Branch (1596:7): [True: 8.76k, False: 0]
  ------------------
 1597|  8.76k|			vips_progress_update(image->progress_signal->time,
 1598|  8.76k|				processed);
 1599|       |
 1600|  8.76k|		if (!vips_image_get_typeof(image, "hide-progress"))
  ------------------
  |  Branch (1600:7): [True: 8.76k, False: 0]
  ------------------
 1601|  8.76k|			g_signal_emit(image->progress_signal,
 1602|  8.76k|				vips_image_signals[SIG_POSTEVAL], 0,
 1603|  8.76k|				image->time);
 1604|  8.76k|	}
 1605|  28.4k|}
vips_image_iskilled:
 1645|   421k|{
 1646|   421k|	gboolean kill;
 1647|       |
 1648|   421k|	kill = image->kill;
 1649|       |
 1650|       |	// check the image we are signalling progress on too
 1651|   421k|	if (image->progress_signal)
  ------------------
  |  Branch (1651:6): [True: 68.4k, False: 353k]
  ------------------
 1652|  68.4k|		kill |= image->progress_signal->kill;
 1653|       |
 1654|       |	/* Has kill been set for this image? If yes, abort evaluation.
 1655|       |	 */
 1656|   421k|	if (kill) {
  ------------------
  |  Branch (1656:6): [True: 0, False: 421k]
  ------------------
 1657|      0|		VIPS_DEBUG_MSG("vips_image_iskilled: %s (%p) killed\n",
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1658|      0|			image->filename, image);
 1659|      0|		vips_error("VipsImage",
 1660|      0|			_("killed for image \"%s\""), image->filename);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1661|       |
 1662|       |		/* We've picked up the kill message, it's now our caller's
 1663|       |		 * responsibility to pass the message up the chain.
 1664|       |		 */
 1665|      0|		vips_image_set_kill(image, FALSE);
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
 1666|      0|	}
 1667|       |
 1668|   421k|	return kill;
 1669|   421k|}
vips_image_set_kill:
 1683|  28.4k|{
 1684|  28.4k|	if (image->kill != kill)
  ------------------
  |  Branch (1684:6): [True: 0, False: 28.4k]
  ------------------
 1685|  28.4k|		VIPS_DEBUG_MSG("vips_image_set_kill: %s (%p) %d\n",
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1686|  28.4k|			image->filename, image, kill);
 1687|       |
 1688|  28.4k|	image->kill = kill;
 1689|       |
 1690|       |	// set here too
 1691|  28.4k|	if (image->progress_signal)
  ------------------
  |  Branch (1691:6): [True: 8.76k, False: 19.6k]
  ------------------
 1692|  8.76k|		image->progress_signal->kill = kill;
 1693|  28.4k|}
vips_image_new:
 1723|   171k|{
 1724|   171k|	VipsImage *image;
 1725|   171k|	char filename[26];
 1726|       |
 1727|   171k|	vips_check_init();
 1728|       |
 1729|   171k|	vips_image_temp_name(filename, sizeof(filename));
 1730|       |
 1731|   171k|	image = VIPS_IMAGE(g_object_new(VIPS_TYPE_IMAGE, NULL));
  ------------------
  |  |  171|   171k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   171k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   171k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|   171k|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
 1732|   171k|	g_object_set(image,
 1733|   171k|		"filename", filename,
 1734|   171k|		"mode", "p",
 1735|   171k|		NULL);
 1736|   171k|	if (vips_object_build(VIPS_OBJECT(image))) {
  ------------------
  |  |  433|   171k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   171k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   171k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1736:6): [True: 0, False: 171k]
  ------------------
 1737|      0|		VIPS_UNREF(image);
  ------------------
  |  |   57|      0|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1738|      0|		return NULL;
 1739|      0|	}
 1740|       |
 1741|   171k|	return image;
 1742|   171k|}
vips_image_new_mode:
 1746|  21.1k|{
 1747|  21.1k|	VipsImage *image;
 1748|       |
 1749|  21.1k|	g_assert(filename);
  ------------------
  |  |  166|  21.1k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  21.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  21.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1750|  21.1k|	g_assert(mode);
  ------------------
  |  |  166|  21.1k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  21.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  21.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1751|       |
 1752|  21.1k|	vips_check_init();
 1753|       |
 1754|  21.1k|	image = VIPS_IMAGE(g_object_new(VIPS_TYPE_IMAGE, NULL));
  ------------------
  |  |  171|  21.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  21.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  21.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|  21.1k|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
 1755|  21.1k|	g_object_set(image,
 1756|  21.1k|		"filename", filename,
 1757|  21.1k|		"mode", mode,
 1758|  21.1k|		NULL);
 1759|  21.1k|	if (vips_object_build(VIPS_OBJECT(image))) {
  ------------------
  |  |  433|  21.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  21.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  21.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1759:6): [True: 0, False: 21.1k]
  ------------------
 1760|      0|		VIPS_UNREF(image);
  ------------------
  |  |   57|      0|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1761|      0|		return NULL;
 1762|      0|	}
 1763|       |
 1764|  21.1k|	return image;
 1765|  21.1k|}
vips_image_new_memory:
 1779|  21.1k|{
 1780|  21.1k|	char filename[26];
 1781|       |
 1782|  21.1k|	vips_image_temp_name(filename, sizeof(filename));
 1783|  21.1k|	return vips_image_new_mode(filename, "t");
 1784|  21.1k|}
vips_image_new_from_buffer:
 2153|  16.7k|{
 2154|  16.7k|	const char *operation_name;
 2155|  16.7k|	va_list ap;
 2156|  16.7k|	int result;
 2157|  16.7k|	VipsImage *out;
 2158|  16.7k|	VipsBlob *blob;
 2159|       |
 2160|  16.7k|	vips_check_init();
 2161|       |
 2162|  16.7k|	if (!(operation_name = vips_foreign_find_load_buffer(buf, len)))
  ------------------
  |  Branch (2162:6): [True: 2.00k, False: 14.7k]
  ------------------
 2163|  2.00k|		return NULL;
 2164|       |
 2165|       |	/* We don't take a copy of the data or free it.
 2166|       |	 */
 2167|  14.7k|	blob = vips_blob_new(NULL, buf, len);
 2168|       |
 2169|  14.7k|	va_start(ap, option_string);
 2170|  14.7k|	result = vips_call_split_option_string(operation_name,
 2171|  14.7k|		option_string, ap, blob, &out);
 2172|  14.7k|	va_end(ap);
 2173|       |
 2174|  14.7k|	vips_area_unref(VIPS_AREA(blob));
  ------------------
  |  |  137|  14.7k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 2175|       |
 2176|  14.7k|	if (result)
  ------------------
  |  Branch (2176:6): [True: 3.28k, False: 11.4k]
  ------------------
 2177|  3.28k|		return NULL;
 2178|       |
 2179|  11.4k|	return out;
 2180|  14.7k|}
vips_get_disc_threshold:
 2517|  10.9k|{
 2518|  10.9k|	static gboolean done = FALSE;
  ------------------
  |  |  794|  10.9k|#define	FALSE	(0)
  ------------------
 2519|  10.9k|	static guint64 threshold;
 2520|       |
 2521|  10.9k|	if (!done) {
  ------------------
  |  Branch (2521:6): [True: 1, False: 10.9k]
  ------------------
 2522|      1|		const char *env;
 2523|       |
 2524|      1|		done = TRUE;
  ------------------
  |  |  798|      1|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      1|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 2525|       |
 2526|       |		/* 100mb default.
 2527|       |		 */
 2528|      1|		threshold = 100 * 1024 * 1024;
 2529|       |
 2530|      1|		if ((env = g_getenv("VIPS_DISC_THRESHOLD"))
  ------------------
  |  Branch (2530:7): [True: 0, False: 1]
  ------------------
 2531|       |#if ENABLE_DEPRECATED
 2532|       |			|| (env = g_getenv("IM_DISC_THRESHOLD"))
 2533|       |#endif
 2534|      1|		)
 2535|      0|			threshold = vips__parse_size(env);
 2536|       |
 2537|      1|		if (vips__disc_threshold)
  ------------------
  |  Branch (2537:7): [True: 0, False: 1]
  ------------------
 2538|      0|			threshold = vips__parse_size(vips__disc_threshold);
 2539|       |
 2540|       |#ifdef DEBUG
 2541|       |		printf("vips_get_disc_threshold: %zd bytes\n", threshold);
 2542|       |#endif /*DEBUG*/
 2543|      1|	}
 2544|       |
 2545|  10.9k|	return threshold;
 2546|  10.9k|}
vips_image_write:
 2625|  42.7k|{
 2626|       |	/* image needs to stay alive for this call. It can be unreffed during
 2627|       |	 * the generate.
 2628|       |	 */
 2629|  42.7k|	g_object_ref(image);
 2630|       |
 2631|  42.7k|	if (vips_image_pio_input(image) ||
  ------------------
  |  Branch (2631:6): [True: 0, False: 42.7k]
  ------------------
 2632|  42.7k|		vips_image_pipelinev(out,
  ------------------
  |  Branch (2632:3): [True: 0, False: 42.7k]
  ------------------
 2633|  42.7k|			VIPS_DEMAND_STYLE_THINSTRIP, image, NULL)) {
 2634|      0|		g_object_unref(image);
 2635|      0|		return -1;
 2636|      0|	}
 2637|       |
 2638|  42.7k|	if (vips_image_generate(out,
  ------------------
  |  Branch (2638:6): [True: 5.52k, False: 37.2k]
  ------------------
 2639|  42.7k|			vips_start_one, vips_image_write_gen, vips_stop_one,
 2640|  42.7k|			image, NULL)) {
 2641|  5.52k|		g_object_unref(image);
 2642|  5.52k|		return -1;
 2643|  5.52k|	}
 2644|       |
 2645|       |	/* If @out is a partial image, we need to unref @image when out is
 2646|       |	 * unreffed.
 2647|       |	 *
 2648|       |	 * If it's not partial, perhaps a file we write to or a memory image,
 2649|       |	 * we need to break any links between @image and @out created by
 2650|       |	 * vips_image_pipelinev().
 2651|       |	 */
 2652|  37.2k|	if (vips_image_ispartial(out)) {
  ------------------
  |  Branch (2652:6): [True: 25.2k, False: 11.9k]
  ------------------
 2653|  25.2k|		vips_object_local(out, image);
  ------------------
  |  |  698|  25.2k|	(g_signal_connect(V, "close", G_CALLBACK(vips_object_local_cb), G))
  |  |  ------------------
  |  |  |  |  491|  25.2k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  |  |  ------------------
  ------------------
 2654|  25.2k|	}
 2655|  11.9k|	else {
 2656|  11.9k|		vips__reorder_clear(out);
 2657|  11.9k|		vips__link_break_all(out);
 2658|  11.9k|		g_object_unref(image);
 2659|  11.9k|	}
 2660|       |
 2661|  37.2k|	return 0;
 2662|  42.7k|}
vips_image_write_to_buffer:
 2753|  10.9k|{
 2754|  10.9k|	char filename[VIPS_PATH_MAX];
 2755|  10.9k|	char option_string[VIPS_PATH_MAX];
 2756|  10.9k|	const char *operation_name;
 2757|  10.9k|	VipsBlob *blob;
 2758|  10.9k|	va_list ap;
 2759|  10.9k|	int result;
 2760|       |
 2761|  10.9k|	vips__filename_split8(suffix, filename, option_string);
 2762|       |
 2763|  10.9k|	vips_error_freeze();
 2764|  10.9k|	operation_name = vips_foreign_find_save_target(filename);
 2765|  10.9k|	vips_error_thaw();
 2766|       |
 2767|  10.9k|	if (operation_name) {
  ------------------
  |  Branch (2767:6): [True: 10.9k, False: 0]
  ------------------
 2768|  10.9k|		VipsTarget *target;
 2769|       |
 2770|  10.9k|		if (!(target = vips_target_new_to_memory()))
  ------------------
  |  Branch (2770:7): [True: 0, False: 10.9k]
  ------------------
 2771|      0|			return -1;
 2772|       |
 2773|  10.9k|		va_start(ap, size);
 2774|  10.9k|		result = vips_call_split_option_string(operation_name,
 2775|  10.9k|			option_string, ap, in, target);
 2776|  10.9k|		va_end(ap);
 2777|       |
 2778|  10.9k|		if (result) {
  ------------------
  |  Branch (2778:7): [True: 6.88k, False: 4.03k]
  ------------------
 2779|  6.88k|			VIPS_UNREF(target);
  ------------------
  |  |   57|  6.88k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  6.88k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  6.88k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  6.88k|	{ \
  |  |  |  |   43|  6.88k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 6.88k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  6.88k|			(void) F((S)); \
  |  |  |  |   45|  6.88k|			(S) = 0; \
  |  |  |  |   46|  6.88k|		} \
  |  |  |  |   47|  6.88k|	} \
  |  |  |  |   48|  6.88k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  6.88k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2780|  6.88k|			return -1;
 2781|  6.88k|		}
 2782|       |
 2783|  4.03k|		g_object_get(target, "blob", &blob, NULL);
 2784|  4.03k|		VIPS_UNREF(target);
  ------------------
  |  |   57|  4.03k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  4.03k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  4.03k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  4.03k|	{ \
  |  |  |  |   43|  4.03k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 4.03k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  4.03k|			(void) F((S)); \
  |  |  |  |   45|  4.03k|			(S) = 0; \
  |  |  |  |   46|  4.03k|		} \
  |  |  |  |   47|  4.03k|	} \
  |  |  |  |   48|  4.03k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  4.03k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2785|  4.03k|	}
 2786|      0|	else if ((operation_name =
  ------------------
  |  Branch (2786:11): [True: 0, False: 0]
  ------------------
 2787|      0|					 vips_foreign_find_save_buffer(filename))) {
 2788|       |
 2789|      0|		va_start(ap, size);
 2790|      0|		result = vips_call_split_option_string(operation_name,
 2791|      0|			option_string, ap, in, &blob);
 2792|      0|		va_end(ap);
 2793|       |
 2794|      0|		if (result)
  ------------------
  |  Branch (2794:7): [True: 0, False: 0]
  ------------------
 2795|      0|			return -1;
 2796|      0|	}
 2797|      0|	else
 2798|      0|		return -1;
 2799|       |
 2800|  4.03k|	*buf = NULL;
 2801|  4.03k|	if (size)
  ------------------
  |  Branch (2801:6): [True: 4.03k, False: 0]
  ------------------
 2802|  4.03k|		*size = 0;
 2803|       |
 2804|  4.03k|	if (blob) {
  ------------------
  |  Branch (2804:6): [True: 4.03k, False: 0]
  ------------------
 2805|  4.03k|		if (buf) {
  ------------------
  |  Branch (2805:7): [True: 4.03k, False: 0]
  ------------------
 2806|  4.03k|			*buf = VIPS_AREA(blob)->data;
  ------------------
  |  |  137|  4.03k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 2807|  4.03k|			VIPS_AREA(blob)->free_fn = NULL;
  ------------------
  |  |  137|  4.03k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 2808|  4.03k|		}
 2809|  4.03k|		if (size)
  ------------------
  |  Branch (2809:7): [True: 4.03k, False: 0]
  ------------------
 2810|  4.03k|			*size = VIPS_AREA(blob)->length;
  ------------------
  |  |  137|  4.03k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 2811|       |
 2812|  4.03k|		vips_area_unref(VIPS_AREA(blob));
  ------------------
  |  |  137|  4.03k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 2813|  4.03k|	}
 2814|       |
 2815|  4.03k|	return 0;
 2816|  10.9k|}
vips_image_decode:
 2925|  37.3k|{
 2926|       |	/* Keep in sync with vips__vector_to_ink().
 2927|       |	 */
 2928|  37.3k|	if (in->Coding == VIPS_CODING_LABQ) {
  ------------------
  |  Branch (2928:6): [True: 1, False: 37.3k]
  ------------------
 2929|      1|		if (vips_LabQ2Lab(in, out, NULL))
  ------------------
  |  Branch (2929:7): [True: 0, False: 1]
  ------------------
 2930|      0|			return -1;
 2931|      1|	}
 2932|  37.3k|	else if (in->Coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (2932:11): [True: 0, False: 37.3k]
  ------------------
 2933|      0|		if (vips_rad2float(in, out, NULL))
  ------------------
  |  Branch (2933:7): [True: 0, False: 0]
  ------------------
 2934|      0|			return -1;
 2935|      0|	}
 2936|  37.3k|	else {
 2937|  37.3k|		if (vips_copy(in, out, NULL))
  ------------------
  |  Branch (2937:7): [True: 0, False: 37.3k]
  ------------------
 2938|      0|			return -1;
 2939|  37.3k|	}
 2940|       |
 2941|  37.3k|	return 0;
 2942|  37.3k|}
vips_image_decode_predict:
 2958|  9.89k|{
 2959|  9.89k|	VipsBandFormat format;
 2960|  9.89k|	int bands;
 2961|       |
 2962|  9.89k|	if (in->Coding == VIPS_CODING_LABQ) {
  ------------------
  |  Branch (2962:6): [True: 0, False: 9.89k]
  ------------------
 2963|      0|		bands = 3;
 2964|      0|		format = VIPS_FORMAT_FLOAT;
 2965|      0|	}
 2966|  9.89k|	else if (in->Coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (2966:11): [True: 0, False: 9.89k]
  ------------------
 2967|      0|		bands = 3;
 2968|      0|		format = VIPS_FORMAT_FLOAT;
 2969|      0|	}
 2970|  9.89k|	else {
 2971|  9.89k|		bands = in->Bands;
 2972|  9.89k|		format = in->BandFmt;
 2973|  9.89k|	}
 2974|       |
 2975|  9.89k|	if (out_bands)
  ------------------
  |  Branch (2975:6): [True: 9.89k, False: 0]
  ------------------
 2976|  9.89k|		*out_bands = bands;
 2977|  9.89k|	if (out_format)
  ------------------
  |  Branch (2977:6): [True: 9, False: 9.88k]
  ------------------
 2978|      9|		*out_format = format;
 2979|       |
 2980|  9.89k|	return 0;
 2981|  9.89k|}
vips_image_encode:
 2998|  8.75k|{
 2999|  8.75k|	if (coding == VIPS_CODING_LABQ) {
  ------------------
  |  Branch (2999:6): [True: 0, False: 8.75k]
  ------------------
 3000|      0|		if (vips_Lab2LabQ(in, out, NULL))
  ------------------
  |  Branch (3000:7): [True: 0, False: 0]
  ------------------
 3001|      0|			return -1;
 3002|      0|	}
 3003|  8.75k|	else if (coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (3003:11): [True: 0, False: 8.75k]
  ------------------
 3004|      0|		if (vips_float2rad(in, out, NULL))
  ------------------
  |  Branch (3004:7): [True: 0, False: 0]
  ------------------
 3005|      0|			return -1;
 3006|      0|	}
 3007|  8.75k|	else {
 3008|  8.75k|		if (vips_copy(in, out, NULL))
  ------------------
  |  Branch (3008:7): [True: 0, False: 8.75k]
  ------------------
 3009|      0|			return -1;
 3010|  8.75k|	}
 3011|       |
 3012|  8.75k|	return 0;
 3013|  8.75k|}
vips_image_ispartial:
 3068|  37.2k|{
 3069|  37.2k|	if (image->dtype == VIPS_IMAGE_PARTIAL)
  ------------------
  |  Branch (3069:6): [True: 25.2k, False: 11.9k]
  ------------------
 3070|  25.2k|		return 1;
 3071|  11.9k|	else
 3072|  11.9k|		return 0;
 3073|  37.2k|}
vips_image_hasalpha:
 3087|  10.9k|{
 3088|       |	/* The result of hasalpha is used to turn on things like
 3089|       |	 * premultiplication, so we are rather conservative about when we
 3090|       |	 * signal this. We don't want to premultiply things that should not be
 3091|       |	 * premultiplied.
 3092|       |	 */
 3093|  10.9k|	switch (image->Type) {
 3094|      0|	case VIPS_INTERPRETATION_B_W:
  ------------------
  |  Branch (3094:2): [True: 0, False: 10.9k]
  ------------------
 3095|      0|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (3095:2): [True: 0, False: 10.9k]
  ------------------
 3096|      0|		return image->Bands > 1;
 3097|       |
 3098|      0|	case VIPS_INTERPRETATION_RGB:
  ------------------
  |  Branch (3098:2): [True: 0, False: 10.9k]
  ------------------
 3099|      0|	case VIPS_INTERPRETATION_CMC:
  ------------------
  |  Branch (3099:2): [True: 0, False: 10.9k]
  ------------------
 3100|      0|	case VIPS_INTERPRETATION_LCH:
  ------------------
  |  Branch (3100:2): [True: 0, False: 10.9k]
  ------------------
 3101|      0|	case VIPS_INTERPRETATION_LABS:
  ------------------
  |  Branch (3101:2): [True: 0, False: 10.9k]
  ------------------
 3102|  10.2k|	case VIPS_INTERPRETATION_sRGB:
  ------------------
  |  Branch (3102:2): [True: 10.2k, False: 710]
  ------------------
 3103|  10.2k|	case VIPS_INTERPRETATION_YXY:
  ------------------
  |  Branch (3103:2): [True: 0, False: 10.9k]
  ------------------
 3104|  10.2k|	case VIPS_INTERPRETATION_XYZ:
  ------------------
  |  Branch (3104:2): [True: 0, False: 10.9k]
  ------------------
 3105|  10.2k|	case VIPS_INTERPRETATION_LAB:
  ------------------
  |  Branch (3105:2): [True: 0, False: 10.9k]
  ------------------
 3106|  10.7k|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (3106:2): [True: 494, False: 10.4k]
  ------------------
 3107|  10.7k|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (3107:2): [True: 0, False: 10.9k]
  ------------------
 3108|  10.7k|	case VIPS_INTERPRETATION_HSV:
  ------------------
  |  Branch (3108:2): [True: 0, False: 10.9k]
  ------------------
 3109|  10.7k|		return image->Bands > 3;
 3110|       |
 3111|      0|	case VIPS_INTERPRETATION_CMYK:
  ------------------
  |  Branch (3111:2): [True: 0, False: 10.9k]
  ------------------
 3112|      0|		return image->Bands > 4;
 3113|       |
 3114|    216|	default:
  ------------------
  |  Branch (3114:2): [True: 216, False: 10.7k]
  ------------------
 3115|       |		/* We can't really infer anything about bands from things like
 3116|       |		 * HISTOGRAM or FOURIER.
 3117|       |		 */
 3118|    216|		return FALSE;
  ------------------
  |  |  794|    216|#define	FALSE	(0)
  ------------------
 3119|  10.9k|	}
 3120|  10.9k|}
vips_image_write_prepare:
 3137|  19.9k|{
 3138|  19.9k|	g_assert(vips_object_sanity(VIPS_OBJECT(image)));
  ------------------
  |  |  166|  19.9k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  19.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3139|       |
 3140|  19.9k|	if (image->Xsize <= 0 ||
  ------------------
  |  Branch (3140:6): [True: 0, False: 19.9k]
  ------------------
 3141|  19.9k|		image->Ysize <= 0 ||
  ------------------
  |  Branch (3141:3): [True: 0, False: 19.9k]
  ------------------
 3142|  19.9k|		image->Bands <= 0) {
  ------------------
  |  Branch (3142:3): [True: 0, False: 19.9k]
  ------------------
 3143|      0|		vips_error("VipsImage", "%s", _("bad dimensions"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3144|      0|		return -1;
 3145|      0|	}
 3146|       |
 3147|       |	/* We don't use this, but make sure it's set in case any old programs
 3148|       |	 * are expecting it.
 3149|       |	 */
 3150|  19.9k|	image->Bbits = vips_format_sizeof(image->BandFmt) << 3;
 3151|       |
 3152|  19.9k|	if (image->dtype == VIPS_IMAGE_PARTIAL) {
  ------------------
  |  Branch (3152:6): [True: 0, False: 19.9k]
  ------------------
 3153|      0|		VIPS_DEBUG_MSG("vips_image_write_prepare: old-style output for %s\n",
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3154|      0|			image->filename);
 3155|       |
 3156|      0|		image->dtype = VIPS_IMAGE_SETBUF;
 3157|      0|	}
 3158|       |
 3159|  19.9k|	switch (image->dtype) {
 3160|      0|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (3160:2): [True: 0, False: 19.9k]
  ------------------
 3161|      0|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (3161:2): [True: 0, False: 19.9k]
  ------------------
 3162|      0|		break;
 3163|       |
 3164|  19.9k|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (3164:2): [True: 19.9k, False: 0]
  ------------------
 3165|  19.9k|		if (!image->data &&
  ------------------
  |  Branch (3165:7): [True: 19.9k, False: 0]
  ------------------
 3166|  19.9k|			!(image->data = vips_tracked_malloc(
  ------------------
  |  Branch (3166:4): [True: 0, False: 19.9k]
  ------------------
 3167|  19.9k|				  VIPS_IMAGE_SIZEOF_IMAGE(image))))
  ------------------
  |  |  388|  19.9k|	(VIPS_IMAGE_SIZEOF_LINE(I) * (I)->Ysize)
  |  |  ------------------
  |  |  |  |  386|  19.9k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  19.9k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  19.9k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3168|      0|			return -1;
 3169|       |
 3170|  19.9k|		break;
 3171|       |
 3172|  19.9k|	case VIPS_IMAGE_OPENOUT:
  ------------------
  |  Branch (3172:2): [True: 0, False: 19.9k]
  ------------------
 3173|      0|		if (vips_image_open_output(image))
  ------------------
  |  Branch (3173:7): [True: 0, False: 0]
  ------------------
 3174|      0|			return -1;
 3175|       |
 3176|      0|		break;
 3177|       |
 3178|      0|	default:
  ------------------
  |  Branch (3178:2): [True: 0, False: 19.9k]
  ------------------
 3179|      0|		vips_error("VipsImage", "%s", _("bad image descriptor"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3180|      0|		return -1;
 3181|  19.9k|	}
 3182|       |
 3183|  19.9k|	return 0;
 3184|  19.9k|}
vips_image_pio_input:
 3628|   128k|{
 3629|   128k|	g_assert(vips_object_sanity(VIPS_OBJECT(image)));
  ------------------
  |  |  166|   128k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   128k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   128k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3630|       |
 3631|       |#ifdef DEBUG_IO
 3632|       |	printf("vips_image_pio_input: enabling partial input for %s\n",
 3633|       |		image->filename);
 3634|       |#endif /*DEBUG_IO*/
 3635|       |
 3636|   128k|	switch (image->dtype) {
 3637|  15.2k|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (3637:2): [True: 15.2k, False: 112k]
  ------------------
 3638|  15.2k|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (3638:2): [True: 0, False: 128k]
  ------------------
 3639|       |		/* Should have been written to.
 3640|       |		 */
 3641|  15.2k|		if (!image->data) {
  ------------------
  |  Branch (3641:7): [True: 0, False: 15.2k]
  ------------------
 3642|      0|			vips_error("vips_image_pio_input",
 3643|      0|				"%s", _("no image data"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3644|      0|			return -1;
 3645|      0|		}
 3646|       |
 3647|       |		/* Should be no generate functions now.
 3648|       |		 */
 3649|  15.2k|		image->start_fn = NULL;
 3650|  15.2k|		image->generate_fn = NULL;
 3651|  15.2k|		image->stop_fn = NULL;
 3652|       |
 3653|  15.2k|		break;
 3654|       |
 3655|   112k|	case VIPS_IMAGE_PARTIAL:
  ------------------
  |  Branch (3655:2): [True: 112k, False: 15.2k]
  ------------------
 3656|       |		/* We can sometimes want to copy images with no generate func,
 3657|       |		 * eg. if we are going to be manipulating metadata, so we
 3658|       |		 * can't check for gen funcs. See dzsave direct mode.
 3659|       |		 */
 3660|   112k|		break;
 3661|       |
 3662|      0|	case VIPS_IMAGE_MMAPIN:
  ------------------
  |  Branch (3662:2): [True: 0, False: 128k]
  ------------------
 3663|      0|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (3663:2): [True: 0, False: 128k]
  ------------------
 3664|      0|	case VIPS_IMAGE_OPENIN:
  ------------------
  |  Branch (3664:2): [True: 0, False: 128k]
  ------------------
 3665|      0|		break;
 3666|       |
 3667|      0|	case VIPS_IMAGE_OPENOUT:
  ------------------
  |  Branch (3667:2): [True: 0, False: 128k]
  ------------------
 3668|       |
 3669|       |		/* Free any resources the image holds and reset to a base
 3670|       |		 * state.
 3671|       |		 */
 3672|      0|		if (vips_image_rewind_output(image))
  ------------------
  |  Branch (3672:7): [True: 0, False: 0]
  ------------------
 3673|      0|			return -1;
 3674|       |
 3675|      0|		break;
 3676|       |
 3677|      0|	default:
  ------------------
  |  Branch (3677:2): [True: 0, False: 128k]
  ------------------
 3678|      0|		vips_error("vips_image_pio_input",
 3679|      0|			"%s", _("image not readable"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3680|      0|		return -1;
 3681|   128k|	}
 3682|       |
 3683|   128k|	return 0;
 3684|   128k|}
vips_band_format_isint:
 3745|  60.9k|{
 3746|  60.9k|	switch (format) {
 3747|  56.4k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3747:2): [True: 56.4k, False: 4.46k]
  ------------------
 3748|  56.4k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3748:2): [True: 0, False: 60.9k]
  ------------------
 3749|  60.7k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3749:2): [True: 4.30k, False: 56.6k]
  ------------------
 3750|  60.8k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3750:2): [True: 52, False: 60.8k]
  ------------------
 3751|  60.8k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3751:2): [True: 6, False: 60.9k]
  ------------------
 3752|  60.8k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3752:2): [True: 0, False: 60.9k]
  ------------------
 3753|  60.8k|		return TRUE;
  ------------------
  |  |  798|  60.8k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  60.8k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3754|       |
 3755|    108|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3755:2): [True: 108, False: 60.8k]
  ------------------
 3756|    108|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3756:2): [True: 0, False: 60.9k]
  ------------------
 3757|    108|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3757:2): [True: 0, False: 60.9k]
  ------------------
 3758|    108|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3758:2): [True: 0, False: 60.9k]
  ------------------
 3759|    108|		return FALSE;
  ------------------
  |  |  794|    108|#define	FALSE	(0)
  ------------------
 3760|       |
 3761|      0|	default:
  ------------------
  |  Branch (3761:2): [True: 0, False: 60.9k]
  ------------------
 3762|      0|		g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3763|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
 3764|  60.9k|	}
 3765|  60.9k|}
vips_band_format_isuint:
 3775|  11.3k|{
 3776|  11.3k|	switch (format) {
 3777|  4.20k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3777:2): [True: 4.20k, False: 7.11k]
  ------------------
 3778|  5.17k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3778:2): [True: 972, False: 10.3k]
  ------------------
 3779|  6.25k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3779:2): [True: 1.08k, False: 10.2k]
  ------------------
 3780|  6.25k|		return TRUE;
  ------------------
  |  |  798|  6.25k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  6.25k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3781|       |
 3782|    322|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3782:2): [True: 322, False: 10.9k]
  ------------------
 3783|    576|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3783:2): [True: 254, False: 11.0k]
  ------------------
 3784|  1.87k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3784:2): [True: 1.30k, False: 10.0k]
  ------------------
 3785|  5.05k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3785:2): [True: 3.18k, False: 8.13k]
  ------------------
 3786|  5.05k|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3786:2): [True: 0, False: 11.3k]
  ------------------
 3787|  5.05k|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3787:2): [True: 0, False: 11.3k]
  ------------------
 3788|  5.05k|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3788:2): [True: 0, False: 11.3k]
  ------------------
 3789|  5.05k|		return FALSE;
  ------------------
  |  |  794|  5.05k|#define	FALSE	(0)
  ------------------
 3790|       |
 3791|      0|	default:
  ------------------
  |  Branch (3791:2): [True: 0, False: 11.3k]
  ------------------
 3792|      0|		g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3793|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
 3794|  11.3k|	}
 3795|  11.3k|}
vips_band_format_is8bit:
 3805|  3.97k|{
 3806|  3.97k|	switch (format) {
 3807|  3.12k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3807:2): [True: 3.12k, False: 847]
  ------------------
 3808|  3.12k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3808:2): [True: 0, False: 3.97k]
  ------------------
 3809|  3.12k|		return TRUE;
  ------------------
  |  |  798|  3.12k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  3.12k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3810|       |
 3811|    676|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3811:2): [True: 676, False: 3.29k]
  ------------------
 3812|    778|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3812:2): [True: 102, False: 3.86k]
  ------------------
 3813|    778|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3813:2): [True: 0, False: 3.97k]
  ------------------
 3814|    778|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3814:2): [True: 0, False: 3.97k]
  ------------------
 3815|    847|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3815:2): [True: 69, False: 3.90k]
  ------------------
 3816|    847|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3816:2): [True: 0, False: 3.97k]
  ------------------
 3817|    847|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3817:2): [True: 0, False: 3.97k]
  ------------------
 3818|    847|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3818:2): [True: 0, False: 3.97k]
  ------------------
 3819|    847|		return FALSE;
  ------------------
  |  |  794|    847|#define	FALSE	(0)
  ------------------
 3820|       |
 3821|      0|	default:
  ------------------
  |  Branch (3821:2): [True: 0, False: 3.97k]
  ------------------
 3822|      0|		g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3823|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
 3824|  3.97k|	}
 3825|  3.97k|}
vips_band_format_isfloat:
 3835|  9.08k|{
 3836|  9.08k|	switch (format) {
 3837|    635|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3837:2): [True: 635, False: 8.44k]
  ------------------
 3838|    635|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3838:2): [True: 0, False: 9.08k]
  ------------------
 3839|    635|		return TRUE;
  ------------------
  |  |  798|    635|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    635|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3840|       |
 3841|  6.58k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3841:2): [True: 6.58k, False: 2.50k]
  ------------------
 3842|  6.76k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3842:2): [True: 188, False: 8.89k]
  ------------------
 3843|  7.61k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3843:2): [True: 842, False: 8.23k]
  ------------------
 3844|  7.68k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3844:2): [True: 74, False: 9.00k]
  ------------------
 3845|  8.27k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3845:2): [True: 586, False: 8.49k]
  ------------------
 3846|  8.44k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3846:2): [True: 176, False: 8.90k]
  ------------------
 3847|  8.44k|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3847:2): [True: 0, False: 9.08k]
  ------------------
 3848|  8.44k|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3848:2): [True: 0, False: 9.08k]
  ------------------
 3849|  8.44k|		return FALSE;
  ------------------
  |  |  794|  8.44k|#define	FALSE	(0)
  ------------------
 3850|       |
 3851|      0|	default:
  ------------------
  |  Branch (3851:2): [True: 0, False: 9.08k]
  ------------------
 3852|      0|		g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3853|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
 3854|  9.08k|	}
 3855|  9.08k|}
vips_band_format_iscomplex:
 3865|  11.7k|{
 3866|  11.7k|	switch (format) {
 3867|      0|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3867:2): [True: 0, False: 11.7k]
  ------------------
 3868|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3868:2): [True: 0, False: 11.7k]
  ------------------
 3869|      0|		return TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3870|       |
 3871|  7.18k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3871:2): [True: 7.18k, False: 4.59k]
  ------------------
 3872|  7.49k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3872:2): [True: 314, False: 11.4k]
  ------------------
 3873|  9.63k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3873:2): [True: 2.13k, False: 9.65k]
  ------------------
 3874|  9.79k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3874:2): [True: 161, False: 11.6k]
  ------------------
 3875|  10.5k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3875:2): [True: 727, False: 11.0k]
  ------------------
 3876|  10.8k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3876:2): [True: 310, False: 11.4k]
  ------------------
 3877|  11.7k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3877:2): [True: 955, False: 10.8k]
  ------------------
 3878|  11.7k|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3878:2): [True: 0, False: 11.7k]
  ------------------
 3879|  11.7k|		return FALSE;
  ------------------
  |  |  794|  11.7k|#define	FALSE	(0)
  ------------------
 3880|       |
 3881|      0|	default:
  ------------------
  |  Branch (3881:2): [True: 0, False: 11.7k]
  ------------------
 3882|      0|		g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3883|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
 3884|  11.7k|	}
 3885|  11.7k|}
image.c:vips_image_class_init:
 1058|      1|{
 1059|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1060|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1061|       |
 1062|      1|	VIPS_DEBUG_MSG("vips_image_class_init:\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1063|       |
 1064|      1|	gobject_class->finalize = vips_image_finalize;
 1065|      1|	gobject_class->dispose = vips_image_dispose;
 1066|      1|	gobject_class->set_property = vips_object_set_property;
 1067|      1|	gobject_class->get_property = vips_object_get_property;
 1068|       |
 1069|      1|	vobject_class->new_from_string = vips_image_new_from_file_object;
 1070|      1|	vobject_class->to_string = vips_image_to_string;
 1071|      1|	vobject_class->output_needs_arg = TRUE;
  ------------------
  |  |  798|      1|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      1|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1072|      1|	vobject_class->output_to_arg = vips_image_write_object;
 1073|       |
 1074|      1|	vobject_class->nickname = "image";
 1075|      1|	vobject_class->description = _("image class");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1076|       |
 1077|      1|	vobject_class->dump = vips_image_dump;
 1078|      1|	vobject_class->summary = vips_image_summary;
 1079|      1|	vobject_class->sanity = vips_image_sanity;
 1080|      1|	vobject_class->rewind = vips_image_rewind;
 1081|      1|	vobject_class->build = vips_image_build;
 1082|       |
 1083|      1|	class->invalidate = vips_image_real_invalidate;
 1084|      1|	class->written = vips_image_real_written;
 1085|      1|	class->minimise = vips_image_real_minimise;
 1086|       |
 1087|       |	/* Create properties.
 1088|       |	 */
 1089|       |
 1090|       |	/* It'd be good to have these as set once at construct time, but we
 1091|       |	 * can't :-(
 1092|       |	 *
 1093|       |	 * For example, a "p" image might be made with vips_image_new() and
 1094|       |	 * constructed, then passed to vips_copy() of whatever to be written to.
 1095|       |	 * That operation will then need to set width/height etc.
 1096|       |	 *
 1097|       |	 * We can't set_once either, since vips_copy() etc. need to update
 1098|       |	 * xoffset and friends on the way through.
 1099|       |	 */
 1100|       |
 1101|      1|	VIPS_ARG_INT(class, "width", 2,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1102|      1|		_("Width"),
 1103|      1|		_("Image width in pixels"),
 1104|      1|		VIPS_ARGUMENT_SET_ALWAYS,
 1105|      1|		G_STRUCT_OFFSET(VipsImage, Xsize),
 1106|      1|		1, VIPS_MAX_COORD, 1);
 1107|       |
 1108|      1|	VIPS_ARG_INT(class, "height", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1109|      1|		_("Height"),
 1110|      1|		_("Image height in pixels"),
 1111|      1|		VIPS_ARGUMENT_SET_ALWAYS,
 1112|      1|		G_STRUCT_OFFSET(VipsImage, Ysize),
 1113|      1|		1, VIPS_MAX_COORD, 1);
 1114|       |
 1115|      1|	VIPS_ARG_INT(class, "bands", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1116|      1|		_("Bands"),
 1117|      1|		_("Number of bands in image"),
 1118|      1|		VIPS_ARGUMENT_SET_ALWAYS,
 1119|      1|		G_STRUCT_OFFSET(VipsImage, Bands),
 1120|      1|		1, VIPS_MAX_COORD, 1);
 1121|       |
 1122|      1|	VIPS_ARG_ENUM(class, "format", 5,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
 1123|      1|		_("Format"),
 1124|      1|		_("Pixel format in image"),
 1125|      1|		VIPS_ARGUMENT_SET_ALWAYS,
 1126|      1|		G_STRUCT_OFFSET(VipsImage, BandFmt),
 1127|      1|		VIPS_TYPE_BAND_FORMAT, VIPS_FORMAT_UCHAR);
 1128|       |
 1129|      1|	VIPS_ARG_ENUM(class, "coding", 6,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
 1130|      1|		_("Coding"),
 1131|      1|		_("Pixel coding"),
 1132|      1|		VIPS_ARGUMENT_SET_ALWAYS,
 1133|      1|		G_STRUCT_OFFSET(VipsImage, Coding),
 1134|      1|		VIPS_TYPE_CODING, VIPS_CODING_NONE);
 1135|       |
 1136|      1|	VIPS_ARG_ENUM(class, "interpretation", 7,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
 1137|      1|		_("Interpretation"),
 1138|      1|		_("Pixel interpretation"),
 1139|      1|		VIPS_ARGUMENT_SET_ALWAYS,
 1140|      1|		G_STRUCT_OFFSET(VipsImage, Type),
 1141|      1|		VIPS_TYPE_INTERPRETATION, VIPS_INTERPRETATION_MULTIBAND);
 1142|       |
 1143|      1|	VIPS_ARG_DOUBLE(class, "xres", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
 1144|      1|		_("Xres"),
 1145|      1|		_("Horizontal resolution in pixels/mm"),
 1146|      1|		VIPS_ARGUMENT_SET_ALWAYS,
 1147|      1|		G_STRUCT_OFFSET(VipsImage, Xres),
 1148|      1|		-0.0, 1000000, 0);
 1149|       |
 1150|      1|	VIPS_ARG_DOUBLE(class, "yres", 9,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
 1151|      1|		_("Yres"),
 1152|      1|		_("Vertical resolution in pixels/mm"),
 1153|      1|		VIPS_ARGUMENT_SET_ALWAYS,
 1154|      1|		G_STRUCT_OFFSET(VipsImage, Yres),
 1155|      1|		-0.0, 1000000, 0);
 1156|       |
 1157|      1|	VIPS_ARG_INT(class, "xoffset", 10,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1158|      1|		_("Xoffset"),
 1159|      1|		_("Horizontal offset of origin"),
 1160|      1|		VIPS_ARGUMENT_SET_ALWAYS,
 1161|      1|		G_STRUCT_OFFSET(VipsImage, Xoffset),
 1162|      1|		-VIPS_MAX_COORD, VIPS_MAX_COORD, 0);
 1163|       |
 1164|      1|	VIPS_ARG_INT(class, "yoffset", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
 1165|      1|		_("Yoffset"),
 1166|      1|		_("Vertical offset of origin"),
 1167|      1|		VIPS_ARGUMENT_SET_ALWAYS,
 1168|      1|		G_STRUCT_OFFSET(VipsImage, Yoffset),
 1169|      1|		-VIPS_MAX_COORD, VIPS_MAX_COORD, 0);
 1170|       |
 1171|      1|	VIPS_ARG_STRING(class, "filename", 12,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1172|      1|		_("Filename"),
 1173|      1|		_("Image filename"),
 1174|      1|		VIPS_ARGUMENT_SET_ONCE | VIPS_ARGUMENT_CONSTRUCT,
 1175|      1|		G_STRUCT_OFFSET(VipsImage, filename),
 1176|      1|		NULL);
 1177|       |
 1178|      1|	VIPS_ARG_STRING(class, "mode", 13,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1179|      1|		_("Mode"),
 1180|      1|		_("Open mode"),
 1181|      1|		VIPS_ARGUMENT_SET_ONCE | VIPS_ARGUMENT_CONSTRUCT,
 1182|      1|		G_STRUCT_OFFSET(VipsImage, mode),
 1183|      1|		"p");
 1184|       |
 1185|      1|	VIPS_ARG_BOOL(class, "kill", 14,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1186|      1|		_("Kill"),
 1187|      1|		_("Block evaluation on this image"),
 1188|      1|		VIPS_ARGUMENT_SET_ALWAYS,
 1189|      1|		G_STRUCT_OFFSET(VipsImage, kill),
 1190|      1|		FALSE);
 1191|       |
 1192|      1|	VIPS_ARG_ENUM(class, "demand", 15,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
 1193|      1|		_("Demand style"),
 1194|      1|		_("Preferred demand style for this image"),
 1195|      1|		VIPS_ARGUMENT_CONSTRUCT,
 1196|      1|		G_STRUCT_OFFSET(VipsImage, dhint),
 1197|      1|		VIPS_TYPE_DEMAND_STYLE, VIPS_DEMAND_STYLE_SMALLTILE);
 1198|       |
 1199|      1|	VIPS_ARG_UINT64(class, "sizeof_header", 16,
  ------------------
  |  |  198|      1|	{ \
  |  |  199|      1|		GParamSpec *pspec; \
  |  |  200|      1|\
  |  |  201|      1|		pspec = g_param_spec_uint64((NAME), (LONG), (DESC), \
  |  |  202|      1|			(MIN), (MAX), (VALUE), \
  |  |  203|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  204|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  205|      1|			vips_argument_get_id(), pspec); \
  |  |  206|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  207|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  208|      1|	}
  ------------------
 1200|      1|		_("Size of header"),
 1201|      1|		_("Offset in bytes from start of file"),
 1202|      1|		VIPS_ARGUMENT_SET_ONCE | VIPS_ARGUMENT_CONSTRUCT,
 1203|      1|		G_STRUCT_OFFSET(VipsImage, sizeof_header),
 1204|      1|		0, 1000000000, VIPS_SIZEOF_HEADER);
 1205|       |
 1206|      1|	VIPS_ARG_POINTER(class, "foreign_buffer", 17,
  ------------------
  |  |  253|      1|	{ \
  |  |  254|      1|		GParamSpec *pspec; \
  |  |  255|      1|\
  |  |  256|      1|		pspec = g_param_spec_pointer((NAME), (LONG), (DESC), \
  |  |  257|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  258|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  259|      1|			vips_argument_get_id(), pspec); \
  |  |  260|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  261|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  262|      1|	}
  ------------------
 1207|      1|		_("Foreign buffer"),
 1208|      1|		_("Pointer to foreign pixels"),
 1209|      1|		VIPS_ARGUMENT_SET_ONCE | VIPS_ARGUMENT_CONSTRUCT,
 1210|      1|		G_STRUCT_OFFSET(VipsImage, data));
 1211|       |
 1212|       |	/* Create signals.
 1213|       |	 */
 1214|       |
 1215|       |	/**
 1216|       |	 * VipsImage::preeval:
 1217|       |	 * @image: the image to be calculated
 1218|       |	 * @progress: (type VipsProgress): #VipsProgress for this image
 1219|       |	 *
 1220|       |	 * The ::preeval signal is emitted once before computation of @image
 1221|       |	 * starts. It's a good place to set up evaluation feedback.
 1222|       |	 *
 1223|       |	 * Use vips_image_set_progress() to turn on progress reporting for an
 1224|       |	 * image.
 1225|       |	 */
 1226|      1|	vips_image_signals[SIG_PREEVAL] = g_signal_new("preeval",
 1227|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
 1228|      1|		G_SIGNAL_RUN_LAST,
 1229|      1|		G_STRUCT_OFFSET(VipsImageClass, preeval),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
 1230|      1|		NULL, NULL,
 1231|      1|		g_cclosure_marshal_VOID__POINTER,
 1232|      1|		G_TYPE_NONE, 1,
  ------------------
  |  |   62|      1|#define G_TYPE_NONE			G_TYPE_MAKE_FUNDAMENTAL (1)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1233|      1|		G_TYPE_POINTER);
  ------------------
  |  |  160|      1|#define G_TYPE_POINTER			G_TYPE_MAKE_FUNDAMENTAL (17)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1234|       |
 1235|       |	/**
 1236|       |	 * VipsImage::eval:
 1237|       |	 * @image: the image being calculated
 1238|       |	 * @progress: (type VipsProgress): #VipsProgress for this image
 1239|       |	 *
 1240|       |	 * The ::eval signal is emitted once per work unit (typically a 128 x
 1241|       |	 * 128 area of pixels) during image computation.
 1242|       |	 *
 1243|       |	 * You can use this signal to update user-interfaces with progress
 1244|       |	 * feedback. Beware of updating too frequently: you will usually
 1245|       |	 * need some throttling mechanism.
 1246|       |	 *
 1247|       |	 * Use vips_image_set_progress() to turn on progress reporting for an
 1248|       |	 * image.
 1249|       |	 */
 1250|      1|	vips_image_signals[SIG_EVAL] = g_signal_new("eval",
 1251|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
 1252|      1|		G_SIGNAL_RUN_LAST,
 1253|      1|		G_STRUCT_OFFSET(VipsImageClass, eval),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
 1254|      1|		NULL, NULL,
 1255|      1|		g_cclosure_marshal_VOID__POINTER,
 1256|      1|		G_TYPE_NONE, 1,
  ------------------
  |  |   62|      1|#define G_TYPE_NONE			G_TYPE_MAKE_FUNDAMENTAL (1)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1257|      1|		G_TYPE_POINTER);
  ------------------
  |  |  160|      1|#define G_TYPE_POINTER			G_TYPE_MAKE_FUNDAMENTAL (17)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1258|       |
 1259|       |	/**
 1260|       |	 * VipsImage::posteval:
 1261|       |	 * @image: the image that was calculated
 1262|       |	 * @progress: (type VipsProgress): #VipsProgress for this image
 1263|       |	 *
 1264|       |	 * The ::posteval signal is emitted once at the end of the computation
 1265|       |	 * of @image. It's a good place to shut down evaluation feedback.
 1266|       |	 *
 1267|       |	 * Use vips_image_set_progress() to turn on progress reporting for an
 1268|       |	 * image.
 1269|       |	 */
 1270|      1|	vips_image_signals[SIG_POSTEVAL] = g_signal_new("posteval",
 1271|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
 1272|      1|		G_SIGNAL_RUN_LAST,
 1273|      1|		G_STRUCT_OFFSET(VipsImageClass, posteval),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
 1274|      1|		NULL, NULL,
 1275|      1|		g_cclosure_marshal_VOID__POINTER,
 1276|      1|		G_TYPE_NONE, 1,
  ------------------
  |  |   62|      1|#define G_TYPE_NONE			G_TYPE_MAKE_FUNDAMENTAL (1)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1277|      1|		G_TYPE_POINTER);
  ------------------
  |  |  160|      1|#define G_TYPE_POINTER			G_TYPE_MAKE_FUNDAMENTAL (17)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1278|       |
 1279|       |	/**
 1280|       |	 * VipsImage::written:
 1281|       |	 * @image: the image that was calculated
 1282|       |	 * @result: (out) (type gint): set to non-zero to indicate error
 1283|       |	 *
 1284|       |	 * The ::written signal is emitted just after an image has been
 1285|       |	 * written to. It is
 1286|       |	 * used by vips to implement things like write to foreign file
 1287|       |	 * formats.
 1288|       |	 */
 1289|      1|	vips_image_signals[SIG_WRITTEN] = g_signal_new("written",
 1290|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
 1291|      1|		G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
 1292|      1|		G_STRUCT_OFFSET(VipsImageClass, written),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
 1293|      1|		NULL, NULL,
 1294|      1|		g_cclosure_marshal_VOID__POINTER,
 1295|      1|		G_TYPE_NONE, 1,
  ------------------
  |  |   62|      1|#define G_TYPE_NONE			G_TYPE_MAKE_FUNDAMENTAL (1)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1296|      1|		G_TYPE_POINTER);
  ------------------
  |  |  160|      1|#define G_TYPE_POINTER			G_TYPE_MAKE_FUNDAMENTAL (17)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1297|       |
 1298|       |	/**
 1299|       |	 * VipsImage::invalidate:
 1300|       |	 * @image: the image that has changed
 1301|       |	 *
 1302|       |	 * The ::invalidate signal is emitted when an image or one of it's
 1303|       |	 * upstream data sources has been destructively modified. See
 1304|       |	 * vips_image_invalidate_all().
 1305|       |	 */
 1306|      1|	vips_image_signals[SIG_INVALIDATE] = g_signal_new("invalidate",
 1307|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
 1308|      1|		G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
 1309|      1|		G_STRUCT_OFFSET(VipsImageClass, invalidate),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
 1310|      1|		NULL, NULL,
 1311|      1|		g_cclosure_marshal_VOID__VOID,
 1312|      1|		G_TYPE_NONE, 0);
  ------------------
  |  |   62|      1|#define G_TYPE_NONE			G_TYPE_MAKE_FUNDAMENTAL (1)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1313|       |
 1314|       |	/**
 1315|       |	 * VipsImage::minimise:
 1316|       |	 * @image: the image that is being minimised
 1317|       |	 *
 1318|       |	 * The ::minimise signal is emitted when an image has been asked to
 1319|       |	 * minimise memory usage. All non-essential caches are dropped.
 1320|       |	 * See vips_image_minimise_all().
 1321|       |	 */
 1322|      1|	vips_image_signals[SIG_MINIMISE] = g_signal_new("minimise",
 1323|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
 1324|      1|		G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
 1325|      1|		G_STRUCT_OFFSET(VipsImageClass, minimise),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
 1326|      1|		NULL, NULL,
 1327|      1|		g_cclosure_marshal_VOID__VOID,
 1328|      1|		G_TYPE_NONE, 0);
  ------------------
  |  |   62|      1|#define G_TYPE_NONE			G_TYPE_MAKE_FUNDAMENTAL (1)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1329|      1|}
image.c:vips_image_finalize:
  427|   192k|{
  428|   192k|	VipsImage *image = VIPS_IMAGE(gobject);
  ------------------
  |  |  171|   192k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   192k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   192k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|   192k|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
  429|       |
  430|   192k|	VIPS_DEBUG_MSG("vips_image_finalize: %p\n", gobject);
  ------------------
  |  |   47|   192k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   192k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   192k|	{ \
  |  |   49|   192k|		; \
  |  |   50|   192k|	} \
  |  |   51|   192k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   192k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  431|       |
  432|       |	/* Should be no regions defined on the image, since they all hold a
  433|       |	 * ref to their host image.
  434|       |	 */
  435|   192k|	g_assert(!image->regions);
  ------------------
  |  |  166|   192k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   192k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   192k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  436|       |
  437|       |	/* Therefore there should be no windows.
  438|       |	 */
  439|   192k|	g_assert(!image->windows);
  ------------------
  |  |  166|   192k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   192k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   192k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  440|       |
  441|       |	/* Junk generate functions.
  442|       |	 */
  443|   192k|	image->start_fn = NULL;
  444|   192k|	image->generate_fn = NULL;
  445|   192k|	image->stop_fn = NULL;
  446|   192k|	image->client1 = NULL;
  447|   192k|	image->client2 = NULL;
  448|       |
  449|       |	/* No more upstream/downstream links.
  450|       |	 */
  451|   192k|	vips__link_break_all(image);
  452|       |
  453|   192k|	if (image->time) {
  ------------------
  |  Branch (453:6): [True: 17.5k, False: 175k]
  ------------------
  454|  17.5k|		VIPS_FREEF(g_timer_destroy, image->time->start);
  ------------------
  |  |   41|  17.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  17.5k|	{ \
  |  |   43|  17.5k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 17.5k, False: 0]
  |  |  ------------------
  |  |   44|  17.5k|			(void) F((S)); \
  |  |   45|  17.5k|			(S) = 0; \
  |  |   46|  17.5k|		} \
  |  |   47|  17.5k|	} \
  |  |   48|  17.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  455|  17.5k|		VIPS_FREE(image->time);
  ------------------
  |  |   50|  17.5k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  17.5k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  17.5k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  17.5k|	{ \
  |  |  |  |   43|  17.5k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 17.5k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  17.5k|			(void) F((S)); \
  |  |  |  |   45|  17.5k|			(S) = 0; \
  |  |  |  |   46|  17.5k|		} \
  |  |  |  |   47|  17.5k|	} \
  |  |  |  |   48|  17.5k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  17.5k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  456|  17.5k|	}
  457|       |
  458|       |	/* Free attached memory.
  459|       |	 */
  460|   192k|	if (image->data) {
  ------------------
  |  Branch (460:6): [True: 19.9k, False: 172k]
  ------------------
  461|  19.9k|		if (image->dtype == VIPS_IMAGE_SETBUF) {
  ------------------
  |  Branch (461:7): [True: 19.9k, False: 0]
  ------------------
  462|  19.9k|			VIPS_DEBUG_MSG("vips_image_finalize: freeing buffer\n");
  ------------------
  |  |   47|  19.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  19.9k|	{ \
  |  |   49|  19.9k|		; \
  |  |   50|  19.9k|	} \
  |  |   51|  19.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  463|  19.9k|			vips_tracked_free(image->data);
  464|  19.9k|			image->dtype = VIPS_IMAGE_NONE;
  465|  19.9k|		}
  466|       |
  467|  19.9k|		image->data = NULL;
  468|  19.9k|	}
  469|       |
  470|       |	/* Delete associated files.
  471|       |	 */
  472|   192k|	vips_image_delete(image);
  473|       |
  474|   192k|	VIPS_FREEF(vips_g_mutex_free, image->sslock);
  ------------------
  |  |   41|   192k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   192k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   192k|	{ \
  |  |   43|   192k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 192k, False: 0]
  |  |  ------------------
  |  |   44|   192k|			(void) F((S)); \
  |  |   45|   192k|			(S) = 0; \
  |  |   46|   192k|		} \
  |  |   47|   192k|	} \
  |  |   48|   192k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   192k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  475|       |
  476|   192k|	VIPS_FREE(image->Hist);
  ------------------
  |  |   50|   192k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   192k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   192k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   192k|	{ \
  |  |  |  |   43|   192k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 192k]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|   192k|	} \
  |  |  |  |   48|   192k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   192k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  477|   192k|	VIPS_FREEF(vips__gslist_gvalue_free, image->history_list);
  ------------------
  |  |   41|   192k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   192k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   192k|	{ \
  |  |   43|   192k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 192k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|   192k|	} \
  |  |   48|   192k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   192k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  478|   192k|	vips__meta_destroy(image);
  479|       |
  480|   192k|	G_OBJECT_CLASS(vips_image_parent_class)->finalize(gobject);
  ------------------
  |  |   58|   192k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|   192k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   192k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  481|   192k|}
image.c:vips_image_delete:
  413|   192k|{
  414|   192k|	if (image->delete_on_close) {
  ------------------
  |  Branch (414:6): [True: 0, False: 192k]
  ------------------
  415|      0|		g_assert(image->delete_on_close_filename);
  ------------------
  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  416|       |
  417|      0|		VIPS_DEBUG_MSG("vips_image_delete: removing temp %s\n",
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  418|      0|			image->delete_on_close_filename);
  419|      0|		g_unlink(image->delete_on_close_filename);
  420|      0|		VIPS_FREE(image->delete_on_close_filename);
  ------------------
  |  |   50|      0|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  421|      0|		image->delete_on_close = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  422|      0|	}
  423|   192k|}
image.c:vips_image_dispose:
  485|   192k|{
  486|   192k|	VipsImage *image = VIPS_IMAGE(gobject);
  ------------------
  |  |  171|   192k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   192k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   192k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|   192k|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
  487|       |
  488|   192k|	VIPS_DEBUG_MSG("vips_image_dispose: %p\n", gobject);
  ------------------
  |  |   47|   192k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   192k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   192k|	{ \
  |  |   49|   192k|		; \
  |  |   50|   192k|	} \
  |  |   51|   192k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   192k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  489|       |
  490|   192k|#ifdef DEBUG_LEAK
  491|   192k|	{
  492|   192k|		VipsImagePixels *pixels = g_object_get_qdata(G_OBJECT(image),
  ------------------
  |  |   51|   192k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|   192k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   192k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  493|   192k|			vips__image_pixels_quark);
  494|       |
  495|   192k|		if (pixels &&
  ------------------
  |  Branch (495:7): [True: 192k, False: 0]
  ------------------
  496|   192k|			pixels->tpels) {
  ------------------
  |  Branch (496:4): [True: 9.30k, False: 183k]
  ------------------
  497|  9.30k|			int compute_percent = 100.0 * pixels->npels / pixels->tpels;
  498|       |
  499|  9.30k|			if (compute_percent > 100)
  ------------------
  |  Branch (499:8): [True: 0, False: 9.30k]
  ------------------
  500|      0|				printf("vips_image_dispose: %s %s computed %d%%\n",
  501|      0|					image->filename,
  502|      0|					pixels->nickname,
  503|      0|					compute_percent);
  504|  9.30k|		}
  505|   192k|	}
  506|   192k|#endif /*DEBUG_LEAK*/
  507|       |
  508|   192k|	vips_object_preclose(VIPS_OBJECT(gobject));
  ------------------
  |  |  433|   192k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   192k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   192k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  509|       |
  510|       |	/* We have to junk the fd in dispose, since we run this for rewind and
  511|       |	 * we must close and reopen the file when we switch from write to
  512|       |	 * read.
  513|       |	 */
  514|       |
  515|       |	/* Any file mapping?
  516|       |	 */
  517|   192k|	if (image->baseaddr) {
  ------------------
  |  Branch (517:6): [True: 0, False: 192k]
  ------------------
  518|       |		/* MMAP file.
  519|       |		 */
  520|      0|		VIPS_DEBUG_MSG("vips_image_dispose: unmapping file\n");
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  521|       |
  522|      0|		vips__munmap(image->baseaddr, image->length);
  523|      0|		image->baseaddr = NULL;
  524|      0|		image->length = 0;
  525|       |
  526|       |		/* This must have been a pointer to the mmap region, rather
  527|       |		 * than a setbuf.
  528|       |		 */
  529|      0|		image->data = NULL;
  530|      0|	}
  531|       |
  532|       |	/* Is there a file descriptor?
  533|       |	 */
  534|   192k|	if (image->fd != -1) {
  ------------------
  |  Branch (534:6): [True: 0, False: 192k]
  ------------------
  535|      0|		VIPS_DEBUG_MSG("vips_image_dispose: closing output file\n");
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  536|       |
  537|      0|		if (vips_tracked_close(image->fd) == -1)
  ------------------
  |  Branch (537:7): [True: 0, False: 0]
  ------------------
  538|      0|			vips_error("VipsImage",
  539|      0|				"%s", _("unable to close fd"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  540|      0|		image->fd = -1;
  541|      0|	}
  542|       |
  543|   192k|	G_OBJECT_CLASS(vips_image_parent_class)->dispose(gobject);
  ------------------
  |  |   58|   192k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|   192k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   192k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  544|   192k|}
image.c:vips_image_build:
  833|   193k|{
  834|   193k|	VipsImage *image = VIPS_IMAGE(object);
  ------------------
  |  |  171|   193k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   193k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   193k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|   193k|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
  835|   193k|	const char *filename = image->filename;
  836|   193k|	const char *mode = image->mode;
  837|       |
  838|   193k|	guint32 magic;
  839|   193k|	guint64 sizeof_image;
  840|       |
  841|   193k|	VIPS_DEBUG_MSG("vips_image_build: %p\n", image);
  ------------------
  |  |   47|   193k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   193k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   193k|	{ \
  |  |   49|   193k|		; \
  |  |   50|   193k|	} \
  |  |   51|   193k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   193k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  842|       |
  843|   193k|	if (VIPS_OBJECT_CLASS(vips_image_parent_class)->build(object))
  ------------------
  |  |  435|   193k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   193k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   193k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (843:6): [True: 0, False: 193k]
  ------------------
  844|      0|		return -1;
  845|       |
  846|       |	/* Parse the mode string.
  847|       |	 */
  848|   193k|	switch (mode[0]) {
  849|      0|	case 'v':
  ------------------
  |  Branch (849:2): [True: 0, False: 193k]
  ------------------
  850|       |		/* Used by 'r' for native open of vips, see below. Also by
  851|       |		 * vips_image_rewind_output().
  852|       |		 */
  853|      0|		if (vips_image_open_input(image))
  ------------------
  |  Branch (853:7): [True: 0, False: 0]
  ------------------
  854|      0|			return -1;
  855|       |
  856|      0|		break;
  857|       |
  858|      0|	case 'r':
  ------------------
  |  Branch (858:2): [True: 0, False: 193k]
  ------------------
  859|      0|		if ((magic = vips__file_magic(filename))) {
  ------------------
  |  Branch (859:7): [True: 0, False: 0]
  ------------------
  860|       |			/* We may need to byteswap.
  861|       |			 */
  862|      0|			if (GUINT_FROM_BE(magic) == image->magic) {
  ------------------
  |  |  407|      0|#define GUINT_FROM_BE(val)	(GUINT_TO_BE (val))
  ------------------
  |  Branch (862:8): [True: 0, False: 0]
  ------------------
  863|       |				/* Native open.
  864|       |				 */
  865|      0|				if (vips_image_open_input(image))
  ------------------
  |  Branch (865:9): [True: 0, False: 0]
  ------------------
  866|      0|					return -1;
  867|      0|			}
  868|      0|			else {
  869|      0|				VipsImage *t;
  870|      0|				VipsImage *t2;
  871|       |
  872|       |				/* Open the image in t, then byteswap to this
  873|       |				 * image.
  874|       |				 */
  875|      0|				if (!(t = vips_image_new_mode(filename,
  ------------------
  |  Branch (875:9): [True: 0, False: 0]
  ------------------
  876|      0|						  "v")))
  877|      0|					return -1;
  878|       |
  879|      0|				if (vips_byteswap(t, &t2, NULL)) {
  ------------------
  |  Branch (879:9): [True: 0, False: 0]
  ------------------
  880|      0|					g_object_unref(t);
  881|      0|					return -1;
  882|      0|				}
  883|      0|				g_object_unref(t);
  884|       |
  885|      0|				image->dtype = VIPS_IMAGE_PARTIAL;
  886|      0|				if (vips_image_write(t2, image)) {
  ------------------
  |  Branch (886:9): [True: 0, False: 0]
  ------------------
  887|      0|					g_object_unref(t2);
  888|      0|					return -1;
  889|      0|				}
  890|      0|				g_object_unref(t2);
  891|      0|			}
  892|      0|		}
  893|      0|		else {
  894|      0|			VipsImage *t;
  895|       |
  896|      0|			if (mode[1] == 's') {
  ------------------
  |  Branch (896:8): [True: 0, False: 0]
  ------------------
  897|      0|				if (vips_foreign_load(filename, &t,
  ------------------
  |  Branch (897:9): [True: 0, False: 0]
  ------------------
  898|      0|						"access", VIPS_ACCESS_SEQUENTIAL,
  899|      0|						NULL))
  900|      0|					return -1;
  901|      0|			}
  902|      0|			else {
  903|      0|				if (vips_foreign_load(filename, &t, NULL))
  ------------------
  |  Branch (903:9): [True: 0, False: 0]
  ------------------
  904|      0|					return -1;
  905|      0|			}
  906|       |
  907|      0|			image->dtype = VIPS_IMAGE_PARTIAL;
  908|      0|			if (vips_image_write(t, image)) {
  ------------------
  |  Branch (908:8): [True: 0, False: 0]
  ------------------
  909|      0|				g_object_unref(t);
  910|      0|				return -1;
  911|      0|			}
  912|      0|			g_object_unref(t);
  913|      0|		}
  914|       |
  915|      0|		break;
  916|       |
  917|      0|	case 'w': {
  ------------------
  |  Branch (917:2): [True: 0, False: 193k]
  ------------------
  918|      0|		const char *file_op;
  919|       |
  920|       |		/* Make sure the vips saver is there ... strange things will
  921|       |		 * happen if this type is renamed or removed.
  922|       |		 */
  923|      0|		g_assert(g_type_from_name("VipsForeignSaveVips"));
  ------------------
  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  924|       |
  925|      0|		if (!(file_op = vips_foreign_find_save(filename)))
  ------------------
  |  Branch (925:7): [True: 0, False: 0]
  ------------------
  926|      0|			return -1;
  927|       |
  928|       |		/* If this is the vips saver, just save directly ourselves.
  929|       |		 * Otherwise save with VipsForeign when the image has been
  930|       |		 * written to.
  931|       |		 */
  932|      0|		if (vips_isprefix("VipsForeignSaveVips", file_op))
  ------------------
  |  Branch (932:7): [True: 0, False: 0]
  ------------------
  933|      0|			image->dtype = VIPS_IMAGE_OPENOUT;
  934|      0|		else {
  935|      0|			image->dtype = VIPS_IMAGE_PARTIAL;
  936|      0|			g_signal_connect(image, "written",
  ------------------
  |  |  491|      0|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  937|      0|				G_CALLBACK(vips_image_save_cb),
  938|      0|				NULL);
  939|      0|		}
  940|      0|	} break;
  941|       |
  942|  21.1k|	case 't':
  ------------------
  |  Branch (942:2): [True: 21.1k, False: 171k]
  ------------------
  943|  21.1k|		image->dtype = VIPS_IMAGE_SETBUF;
  944|  21.1k|		image->dhint = VIPS_DEMAND_STYLE_ANY;
  945|  21.1k|		break;
  946|       |
  947|   171k|	case 'p':
  ------------------
  |  Branch (947:2): [True: 171k, False: 21.1k]
  ------------------
  948|   171k|		image->dtype = VIPS_IMAGE_PARTIAL;
  949|   171k|		break;
  950|       |
  951|      0|	case 'a':
  ------------------
  |  Branch (951:2): [True: 0, False: 193k]
  ------------------
  952|      0|		if ((image->fd = vips__open_image_read(filename)) == -1)
  ------------------
  |  Branch (952:7): [True: 0, False: 0]
  ------------------
  953|      0|			return -1;
  954|      0|		image->dtype = VIPS_IMAGE_OPENIN;
  955|      0|		image->dhint = VIPS_DEMAND_STYLE_THINSTRIP;
  956|       |
  957|      0|		if (image->Bands == 1)
  ------------------
  |  Branch (957:7): [True: 0, False: 0]
  ------------------
  958|      0|			image->Type = VIPS_INTERPRETATION_B_W;
  959|      0|		else if (image->Bands == 3)
  ------------------
  |  Branch (959:12): [True: 0, False: 0]
  ------------------
  960|      0|			image->Type = VIPS_INTERPRETATION_sRGB;
  961|      0|		else
  962|      0|			image->Type = VIPS_INTERPRETATION_MULTIBAND;
  963|       |
  964|       |		/* Read the real file length and check against what we think
  965|       |		 * the size should be.
  966|       |		 */
  967|      0|		if ((image->file_length = vips_file_length(image->fd)) == -1)
  ------------------
  |  Branch (967:7): [True: 0, False: 0]
  ------------------
  968|      0|			return -1;
  969|       |
  970|       |		/* Very common, so a special message.
  971|       |		 */
  972|      0|		sizeof_image = VIPS_IMAGE_SIZEOF_IMAGE(image) +
  ------------------
  |  |  388|      0|	(VIPS_IMAGE_SIZEOF_LINE(I) * (I)->Ysize)
  |  |  ------------------
  |  |  |  |  386|      0|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|      0|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|      0|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  973|      0|			image->sizeof_header;
  974|      0|		if (image->file_length < sizeof_image) {
  ------------------
  |  Branch (974:7): [True: 0, False: 0]
  ------------------
  975|      0|			vips_error("VipsImage",
  976|      0|				_("unable to open \"%s\", file too short"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  977|      0|				image->filename);
  978|      0|			return -1;
  979|      0|		}
  980|       |
  981|       |		/* Just weird. Only print a warning for this, since we should
  982|       |		 * still be able to process it without coredumps.
  983|       |		 */
  984|      0|		if (image->file_length > sizeof_image)
  ------------------
  |  Branch (984:7): [True: 0, False: 0]
  ------------------
  985|      0|			g_warning(_("%s is longer than expected"),
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  986|      0|				image->filename);
  987|      0|		break;
  988|       |
  989|      0|	case 'm':
  ------------------
  |  Branch (989:2): [True: 0, False: 193k]
  ------------------
  990|      0|		if (image->Bands == 1)
  ------------------
  |  Branch (990:7): [True: 0, False: 0]
  ------------------
  991|      0|			image->Type = VIPS_INTERPRETATION_B_W;
  992|      0|		else if (image->Bands == 3)
  ------------------
  |  Branch (992:12): [True: 0, False: 0]
  ------------------
  993|      0|			image->Type = VIPS_INTERPRETATION_sRGB;
  994|      0|		else
  995|      0|			image->Type = VIPS_INTERPRETATION_MULTIBAND;
  996|       |
  997|      0|		image->dtype = VIPS_IMAGE_SETBUF_FOREIGN;
  998|      0|		image->dhint = VIPS_DEMAND_STYLE_ANY;
  999|       |
 1000|      0|		break;
 1001|       |
 1002|      0|	default:
  ------------------
  |  Branch (1002:2): [True: 0, False: 193k]
  ------------------
 1003|      0|		vips_error("VipsImage", _("bad mode \"%s\""), mode);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1004|       |
 1005|      0|		return -1;
 1006|   193k|	}
 1007|       |
 1008|   193k|	vips_image_add_progress(image);
 1009|       |
 1010|   193k|	return 0;
 1011|   193k|}
image.c:vips_image_add_progress:
  803|   193k|{
  804|   193k|	if (vips__progress ||
  ------------------
  |  Branch (804:6): [True: 0, False: 193k]
  ------------------
  805|   193k|		g_getenv("VIPS_PROGRESS")
  ------------------
  |  Branch (805:3): [True: 0, False: 193k]
  ------------------
  806|       |#if ENABLE_DEPRECATED
  807|       |		|| g_getenv("IM_PROGRESS")
  808|       |#endif
  809|   193k|	) {
  810|       |
  811|       |		/* Keep the %complete we displayed last time here.
  812|       |		 */
  813|      0|		int *last = VIPS_NEW(image, int);
  ------------------
  |  |   70|      0|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|      0|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  814|       |
  815|      0|		g_signal_connect(image, "preeval",
  ------------------
  |  |  491|      0|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  816|      0|			G_CALLBACK(vips_image_preeval_cb), last);
  817|      0|		g_signal_connect(image, "eval",
  ------------------
  |  |  491|      0|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  818|      0|			G_CALLBACK(vips_image_eval_cb), last);
  819|      0|		g_signal_connect(image, "posteval",
  ------------------
  |  |  491|      0|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  820|      0|			G_CALLBACK(vips_image_posteval_cb), NULL);
  821|       |
  822|      0|		vips_image_set_progress(image, TRUE);
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  823|      0|	}
  824|   193k|}
image.c:vips_image_real_written:
 1046|   170k|{
 1047|   170k|	VIPS_DEBUG_MSG("vips_image_real_written: %p\n", image);
  ------------------
  |  |   47|   170k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   170k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   170k|	{ \
  |  |   49|   170k|		; \
  |  |   50|   170k|	} \
  |  |   51|   170k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   170k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1048|       |
 1049|       |	/* For vips image write, append the xml after the data.
 1050|       |	 */
 1051|   170k|	if (image->dtype == VIPS_IMAGE_OPENOUT &&
  ------------------
  |  Branch (1051:6): [True: 0, False: 170k]
  ------------------
 1052|   170k|		vips__writehist(image))
  ------------------
  |  Branch (1052:3): [True: 0, False: 0]
  ------------------
 1053|      0|		*result = -1;
 1054|   170k|}
image.c:vips_image_real_minimise:
 1040|   375k|{
 1041|   375k|	VIPS_DEBUG_MSG("vips_image_real_minimise: %p\n", image);
  ------------------
  |  |   47|   375k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   375k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   375k|	{ \
  |  |   49|   375k|		; \
  |  |   50|   375k|	} \
  |  |   51|   375k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   375k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1042|   375k|}
image.c:vips_image_init:
 1333|   193k|{
 1334|   193k|	VIPS_DEBUG_MSG("vips_image_init: %p\n", image);
  ------------------
  |  |   47|   193k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   193k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   193k|	{ \
  |  |   49|   193k|		; \
  |  |   50|   193k|	} \
  |  |   51|   193k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   193k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1335|       |
 1336|       |	/* Default to native order.
 1337|       |	 */
 1338|   193k|	image->magic = vips_amiMSBfirst()
  ------------------
  |  Branch (1338:17): [True: 0, False: 193k]
  ------------------
 1339|   193k|		? VIPS_MAGIC_SPARC
  ------------------
  |  |   55|      0|#define VIPS_MAGIC_SPARC (0x08f2a6b6U)
  ------------------
 1340|   193k|		: VIPS_MAGIC_INTEL;
  ------------------
  |  |   54|   386k|#define VIPS_MAGIC_INTEL (0xb6a6f208U)
  ------------------
 1341|       |
 1342|   193k|	image->Xsize = 1;
 1343|   193k|	image->Ysize = 1;
 1344|   193k|	image->Bands = 1;
 1345|       |
 1346|   193k|	image->Xres = 1.0;
 1347|   193k|	image->Yres = 1.0;
 1348|       |
 1349|   193k|	image->fd = -1; /* since 0 is stdout */
 1350|   193k|	image->sslock = vips_g_mutex_new();
 1351|       |
 1352|   193k|	image->sizeof_header = VIPS_SIZEOF_HEADER;
  ------------------
  |  |   57|   193k|#define VIPS_SIZEOF_HEADER (64)
  ------------------
 1353|       |
 1354|   193k|	image->mode = g_strdup("p");
 1355|       |
 1356|   193k|#ifdef DEBUG_LEAK
 1357|   193k|	g_object_set_qdata_full(G_OBJECT(image), vips__image_pixels_quark,
  ------------------
  |  |   51|   193k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|   193k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   193k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1358|   193k|		g_new0(VipsImagePixels, 1), (GDestroyNotify) g_free);
  ------------------
  |  |  299|   193k|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|   193k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   193k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   193k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   193k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   193k|	  gpointer __p;						\
  |  |  |  |  231|   193k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 193k]
  |  |  |  |  ------------------
  |  |  |  |  232|   193k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   193k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 193k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|   193k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 193k]
  |  |  |  |  |  Branch (234:26): [True: 193k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   193k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   193k|	  else							\
  |  |  |  |  237|   193k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   193k|	  __p;							\
  |  |  |  |  239|   193k|	}))
  |  |  ------------------
  ------------------
 1359|   193k|#endif /*DEBUG_LEAK*/
 1360|   193k|}
image.c:vips_image_minimise_all_cb:
 1425|   375k|{
 1426|   375k|	vips_image_minimise(image);
 1427|       |
 1428|   375k|	return NULL;
 1429|   375k|}
image.c:vips_image_minimise:
 1417|   375k|{
 1418|   375k|	VIPS_DEBUG_MSG("vips_image_minimise: %p\n", image);
  ------------------
  |  |   47|   375k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   375k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   375k|	{ \
  |  |   49|   375k|		; \
  |  |   50|   375k|	} \
  |  |   51|   375k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   375k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1419|       |
 1420|   375k|	g_signal_emit(image, vips_image_signals[SIG_MINIMISE], 0);
 1421|   375k|}
image.c:vips_progress_add:
 1475|  17.5k|{
 1476|  17.5k|	VipsProgress *progress;
 1477|       |
 1478|  17.5k|	VIPS_DEBUG_MSG("vips_progress_add: %p\n", image);
  ------------------
  |  |   47|  17.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  17.5k|	{ \
  |  |   49|  17.5k|		; \
  |  |   50|  17.5k|	} \
  |  |   51|  17.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1479|       |
 1480|  17.5k|	if (!(progress = image->time)) {
  ------------------
  |  Branch (1480:6): [True: 17.5k, False: 0]
  ------------------
 1481|  17.5k|		if (!(image->time = VIPS_NEW(NULL, VipsProgress)))
  ------------------
  |  |   70|  17.5k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  17.5k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  17.5k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  17.5k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  17.5k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1481:7): [True: 0, False: 17.5k]
  ------------------
 1482|      0|			return -1;
 1483|  17.5k|		progress = image->time;
 1484|       |
 1485|  17.5k|		progress->im = image;
 1486|  17.5k|		progress->start = NULL;
 1487|  17.5k|	}
 1488|       |
 1489|  17.5k|	if (!progress->start)
  ------------------
  |  Branch (1489:6): [True: 17.5k, False: 0]
  ------------------
 1490|  17.5k|		progress->start = g_timer_new();
 1491|       |
 1492|  17.5k|	g_timer_start(progress->start);
 1493|  17.5k|	progress->run = 0;
 1494|  17.5k|	progress->eta = 0;
 1495|  17.5k|	progress->tpels = VIPS_IMAGE_N_PELS(image);
  ------------------
  |  |  392|  17.5k|	((guint64) (I)->Xsize * (I)->Ysize)
  ------------------
 1496|  17.5k|	progress->npels = 0;
 1497|  17.5k|	progress->percent = 0;
 1498|       |
 1499|  17.5k|	return 0;
 1500|  17.5k|}
image.c:vips_progress_update:
 1504|  31.6k|{
 1505|  31.6k|	float prop;
 1506|       |
 1507|  31.6k|	VIPS_DEBUG_MSG("vips_progress_update: %p\n", progress);
  ------------------
  |  |   47|  31.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  31.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  31.6k|	{ \
  |  |   49|  31.6k|		; \
  |  |   50|  31.6k|	} \
  |  |   51|  31.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  31.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1508|       |
 1509|  31.6k|	g_assert(progress);
  ------------------
  |  |  166|  31.6k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  31.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  31.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1510|       |
 1511|  31.6k|	progress->run = g_timer_elapsed(progress->start, NULL);
 1512|  31.6k|	progress->npels = processed;
 1513|  31.6k|	prop = (float) progress->npels / (float) progress->tpels;
 1514|  31.6k|	progress->percent = 100 * prop;
 1515|       |
 1516|       |	/* Don't estimate eta until we are 10% in.
 1517|       |	 */
 1518|  31.6k|	if (prop > 0.1)
  ------------------
  |  Branch (1518:6): [True: 31.6k, False: 0]
  ------------------
 1519|  31.6k|		progress->eta = (1.0 / prop) * progress->run - progress->run;
 1520|  31.6k|}
image.c:vips_image_temp_name:
 1700|   193k|{
 1701|   193k|	static int global_serial = 0;
 1702|       |
 1703|   193k|	int serial = g_atomic_int_add(&global_serial, 1);
  ------------------
  |  |  162|   193k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|   193k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  163|   193k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|   193k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  164|   193k|    (void) (0 ? *(atomic) ^ (val) : 1);                                      \
  |  |  ------------------
  |  |  |  Branch (164:13): [Folded - Ignored]
  |  |  ------------------
  |  |  165|   193k|    (gint) __atomic_fetch_add ((atomic), (val), __ATOMIC_SEQ_CST);           \
  |  |  166|   193k|  }))
  ------------------
 1704|       |
 1705|   193k|	g_snprintf(name, size, "temp-%d", serial);
 1706|   193k|}
image.c:vips_image_write_gen:
 2591|  82.1k|{
 2592|  82.1k|	VipsRegion *ir = (VipsRegion *) seq;
 2593|  82.1k|	VipsRect *r = &out_region->valid;
 2594|       |
 2595|       |	/*
 2596|       |	printf("vips_image_write_gen: %p "
 2597|       |		   "left = %d, top = %d, width = %d, height = %d\n",
 2598|       |		out_region->im,
 2599|       |		r->left, r->top, r->width, r->height);
 2600|       |	 */
 2601|       |
 2602|       |	/* Copy with pointers.
 2603|       |	 */
 2604|  82.1k|	if (vips_region_prepare(ir, r) ||
  ------------------
  |  Branch (2604:6): [True: 19.2k, False: 62.9k]
  ------------------
 2605|  82.1k|		vips_region_region(out_region, ir, r, r->left, r->top))
  ------------------
  |  Branch (2605:3): [True: 0, False: 62.9k]
  ------------------
 2606|  19.2k|		return -1;
 2607|       |
 2608|  62.9k|	return 0;
 2609|  82.1k|}

vips_max_coord_get:
  154|  20.5k|{
  155|       |	// CLI overrides env var
  156|  20.5k|	const char *as_str = vips__max_coord_arg ?
  ------------------
  |  Branch (156:23): [True: 0, False: 20.5k]
  ------------------
  157|  20.5k|		vips__max_coord_arg : g_getenv("VIPS_MAX_COORD");
  158|       |
  159|  20.5k|	if (as_str) {
  ------------------
  |  Branch (159:6): [True: 0, False: 20.5k]
  ------------------
  160|      0|		guint64 size = vips__parse_size(as_str);
  161|       |
  162|      0|		return VIPS_CLIP(100, size, INT_MAX);
  ------------------
  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  163|      0|	}
  164|  20.5k|	else
  165|  20.5k|		return VIPS_DEFAULT_MAX_COORD;
  ------------------
  |  |   65|  20.5k|#define VIPS_DEFAULT_MAX_COORD (100000000)
  ------------------
  166|  20.5k|}
vips_init:
  439|   409k|{
  440|   409k|	extern GType vips_system_get_type(void);
  441|   409k|	extern GType write_thread_state_get_type(void);
  442|   409k|	extern GType sink_memory_thread_state_get_type(void);
  443|   409k|	extern GType render_thread_state_get_type(void);
  444|   409k|	extern GType vips_source_get_type(void);
  445|   409k|	extern GType vips_source_custom_get_type(void);
  446|   409k|	extern GType vips_target_get_type(void);
  447|   409k|	extern GType vips_target_custom_get_type(void);
  448|   409k|	extern GType vips_g_input_stream_get_type(void);
  449|       |
  450|   409k|	static gboolean started = FALSE;
  ------------------
  |  |  794|   409k|#define	FALSE	(0)
  ------------------
  451|   409k|	static gboolean done = FALSE;
  ------------------
  |  |  794|   409k|#define	FALSE	(0)
  ------------------
  452|   409k|	const char *vips_min_stack_size;
  453|   409k|	gint64 min_stack_size;
  454|   409k|	const char *prefix;
  455|   409k|	const char *libdir;
  456|   409k|#ifdef ENABLE_NLS
  457|   409k|	char *locale;
  458|   409k|#endif /* ENABLE_NLS */
  459|       |
  460|       |	/* Two stage done handling: 'done' means we've completed, 'started'
  461|       |	 * means we're currently initialising. Use this to prevent recursive
  462|       |	 * invocation.
  463|       |	 */
  464|   409k|	if (done)
  ------------------
  |  Branch (464:6): [True: 409k, False: 2]
  ------------------
  465|       |		/* Called more than once, we succeeded, just return OK.
  466|       |		 */
  467|   409k|		return 0;
  468|      2|	if (started)
  ------------------
  |  Branch (468:6): [True: 0, False: 2]
  ------------------
  469|       |		/* Recursive invocation, something has broken horribly.
  470|       |		 * Hopefully the first init will handle it.
  471|       |		 */
  472|      0|		return 0;
  473|      2|	started = TRUE;
  ------------------
  |  |  798|      2|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      2|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  474|       |
  475|       |	/* Try to set a minimum stacksize, default 2mb. We need to do this
  476|       |	 * before any threads start.
  477|       |	 */
  478|      2|	min_stack_size = 2 * 1024 * 1024;
  479|      2|	if ((vips_min_stack_size = g_getenv("VIPS_MIN_STACK_SIZE")))
  ------------------
  |  Branch (479:6): [True: 0, False: 2]
  ------------------
  480|      0|		min_stack_size = vips__parse_size(vips_min_stack_size);
  481|      2|	(void) set_stacksize(min_stack_size);
  482|       |
  483|      2|	if (g_getenv("VIPS_INFO")
  ------------------
  |  Branch (483:6): [True: 0, False: 2]
  ------------------
  484|       |#if ENABLE_DEPRECATED
  485|       |		|| g_getenv("IM_INFO")
  486|       |#endif
  487|      2|	)
  488|      0|		vips_verbose();
  489|      2|	if (g_getenv("VIPS_PROFILE"))
  ------------------
  |  Branch (489:6): [True: 0, False: 2]
  ------------------
  490|      0|		vips_profile_set(TRUE);
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  491|      2|	if (g_getenv("VIPS_LEAK"))
  ------------------
  |  Branch (491:6): [True: 0, False: 2]
  ------------------
  492|      0|		vips_leak_set(TRUE);
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  493|      2|	if (g_getenv("VIPS_TRACE"))
  ------------------
  |  Branch (493:6): [True: 0, False: 2]
  ------------------
  494|      0|		vips_cache_set_trace(TRUE);
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  495|       |
  496|      2|	const char *pipe_read_limit;
  497|      2|	if ((pipe_read_limit = g_getenv("VIPS_PIPE_READ_LIMIT")))
  ------------------
  |  Branch (497:6): [True: 0, False: 2]
  ------------------
  498|      0|		vips_pipe_read_limit_set(vips__parse_size(pipe_read_limit));
  499|       |
  500|       |#ifdef G_OS_WIN32
  501|       |	/* Windows has a limit of 512 files open at once for the fopen() family
  502|       |	 * of functions, and 2048 for the _open() family. This raises the limit
  503|       |	 * of fopen() to the same level as _open().
  504|       |	 *
  505|       |	 * It will not go any higher than this, unfortunately.
  506|       |	 */
  507|       |	(void) _setmaxstdio(2048);
  508|       |#endif /*G_OS_WIN32*/
  509|       |
  510|      2|	vips__thread_init();
  511|      2|	vips__threadpool_init();
  512|      2|	vips__buffer_init();
  513|       |
  514|      2|	if (!vips__global_timer)
  ------------------
  |  Branch (514:6): [True: 2, False: 0]
  ------------------
  515|      2|		vips__global_timer = g_timer_new();
  516|       |
  517|      2|	VIPS_SETSTR(vips__argv0, argv0);
  ------------------
  |  |   53|      2|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      2|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|      2|	{ \
  |  |   55|      2|		const char *sst = (V); \
  |  |   56|      2|		\
  |  |   57|      2|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 2, False: 0]
  |  |  ------------------
  |  |   58|      2|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 2, False: 0]
  |  |  |  Branch (58:16): [True: 0, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|      2|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|      2|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|      2|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|      2|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|      2|	{ \
  |  |  |  |  |  |   43|      2|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 0, False: 2]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |  |  |   46|      0|		} \
  |  |  |  |  |  |   47|      2|	} \
  |  |  |  |  |  |   48|      2|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|      2|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|      2|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 2, False: 0]
  |  |  ------------------
  |  |   61|      2|					(S) = g_strdup(sst); \
  |  |   62|      2|			} \
  |  |   63|      2|		} \
  |  |   64|      2|	} \
  |  |   65|      2|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      2|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  518|      2|	vips__prgname = g_path_get_basename(argv0);
  519|       |
  520|      2|	vips__thread_profile_attach("main");
  521|       |
  522|       |	/* We can't do VIPS_GATE_START() until command-line processing
  523|       |	 * happens, since vips__thread_profile may not be set yet. Call
  524|       |	 * directly.
  525|       |	 */
  526|      2|	vips__thread_gate_start("init: main");
  527|      2|	vips__thread_gate_start("init: startup");
  528|       |
  529|       |	/* Try to discover our prefix.
  530|       |	 */
  531|      2|	if ((prefix = g_getenv("VIPSHOME")))
  ------------------
  |  Branch (531:6): [True: 1, False: 1]
  ------------------
  532|      1|		g_info("VIPSHOME = %s", prefix);
  ------------------
  |  |  341|      1|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      1|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      1|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      1|                               __VA_ARGS__)
  ------------------
  533|      2|	if (!(prefix = vips_guess_prefix(argv0, "VIPSHOME")) ||
  ------------------
  |  Branch (533:6): [True: 0, False: 2]
  ------------------
  534|      2|		!(libdir = vips_guess_libdir(argv0, "VIPSHOME")))
  ------------------
  |  Branch (534:3): [True: 0, False: 2]
  ------------------
  535|      0|		return -1;
  536|       |
  537|      2|	g_info("VIPS_PREFIX = %s", VIPS_PREFIX);
  ------------------
  |  |  341|      2|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      2|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      2|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      2|                               __VA_ARGS__)
  ------------------
  538|      2|	g_info("VIPS_LIBDIR = %s", VIPS_LIBDIR);
  ------------------
  |  |  341|      2|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      2|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      2|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      2|                               __VA_ARGS__)
  ------------------
  539|      2|	g_info("prefix = %s", prefix);
  ------------------
  |  |  341|      2|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      2|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      2|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      2|                               __VA_ARGS__)
  ------------------
  540|      2|	g_info("libdir = %s", libdir);
  ------------------
  |  |  341|      2|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      2|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      2|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      2|                               __VA_ARGS__)
  ------------------
  541|       |
  542|       |	/* Get i18n .mo files from $VIPSHOME/share/locale/.
  543|       |	 */
  544|      2|#ifdef ENABLE_NLS
  545|      2|	locale = g_build_filename(prefix, "share", "locale", NULL);
  546|      2|	bindtextdomain(GETTEXT_PACKAGE, locale);
  ------------------
  |  |   10|      2|#define GETTEXT_PACKAGE "vips8.17"
  ------------------
  547|      2|	g_free(locale);
  548|      2|#ifdef HAVE_BIND_TEXTDOMAIN_CODESET
  549|      2|	bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
  ------------------
  |  |   10|      2|#define GETTEXT_PACKAGE "vips8.17"
  ------------------
  550|      2|#endif /* HAVE_BIND_TEXTDOMAIN_CODESET */
  551|      2|#endif /* ENABLE_NLS */
  552|       |
  553|       |	/* Register base vips types.
  554|       |	 */
  555|      2|	(void) vips_image_get_type();
  556|      2|	(void) vips_region_get_type();
  557|      2|	(void) write_thread_state_get_type();
  558|      2|	(void) sink_memory_thread_state_get_type();
  559|      2|	(void) render_thread_state_get_type();
  560|      2|	(void) vips_source_get_type();
  561|      2|	(void) vips_source_custom_get_type();
  562|      2|	(void) vips_target_get_type();
  563|      2|	(void) vips_target_custom_get_type();
  564|      2|	vips__meta_init_types();
  565|      2|	vips__interpolate_init();
  566|       |
  567|       |#if ENABLE_DEPRECATED
  568|       |	im__format_init();
  569|       |#endif
  570|       |
  571|       |	/* Start up operator cache.
  572|       |	 */
  573|      2|	vips__cache_init();
  574|       |
  575|       |	/* Recomp reordering system.
  576|       |	 */
  577|      2|	vips__reorder_init();
  578|       |
  579|       |	/* Start up packages.
  580|       |	 */
  581|      2|	(void) vips_system_get_type();
  582|      2|	vips_arithmetic_operation_init();
  583|      2|	vips_conversion_operation_init();
  584|      2|	vips_create_operation_init();
  585|      2|	vips_foreign_operation_init();
  586|      2|	vips_resample_operation_init();
  587|      2|	vips_colour_operation_init();
  588|      2|	vips_histogram_operation_init();
  589|      2|	vips_convolution_operation_init();
  590|      2|	vips_freqfilt_operation_init();
  591|      2|	vips_morphology_operation_init();
  592|      2|	vips_draw_operation_init();
  593|      2|	vips_mosaicing_operation_init();
  594|      2|	vips_g_input_stream_get_type();
  595|       |
  596|       |#ifdef ENABLE_MODULES
  597|       |	/* Load any vips8 modules from the vips libdir. Keep going, even if
  598|       |	 * some modules fail to load.
  599|       |	 *
  600|       |	 * Only do this if we have been built as a set of loadable
  601|       |	 * modules, or we might try loading an operation into a library that
  602|       |	 * already has that operation built in.
  603|       |	 */
  604|       |	vips_load_plugins("%s/vips-modules-%d.%d",
  605|       |		libdir, VIPS_MAJOR_VERSION, VIPS_MINOR_VERSION);
  606|       |
  607|       |#if ENABLE_DEPRECATED
  608|       |	/* We had vips8 plugins for a while.
  609|       |	 */
  610|       |	vips_load_plugins("%s/vips-plugins-%d.%d",
  611|       |		libdir, VIPS_MAJOR_VERSION, VIPS_MINOR_VERSION);
  612|       |
  613|       |	/* Load up any vips7 plugins. We don't error on
  614|       |	 * failure, it's too annoying to have VIPS refuse to start because of
  615|       |	 * a broken plugin.
  616|       |	 */
  617|       |	if (im_load_plugins("%s/vips-%d.%d",
  618|       |			libdir, VIPS_MAJOR_VERSION, VIPS_MINOR_VERSION)) {
  619|       |		g_warning("%s", vips_error_buffer());
  620|       |		vips_error_clear();
  621|       |	}
  622|       |
  623|       |	/* Also load from libdir :-( kept for back compat convenience.
  624|       |	 */
  625|       |	if (im_load_plugins("%s", libdir)) {
  626|       |		g_warning("%s", vips_error_buffer());
  627|       |		vips_error_clear();
  628|       |	}
  629|       |#endif /*ENABLE_DEPRECATED*/
  630|       |#endif /*ENABLE_MODULES*/
  631|       |
  632|       |	/* Detect SIMD features.
  633|       |	 */
  634|      2|	vips__vector_init();
  635|       |
  636|      2|#ifdef DEBUG_LEAK
  637|      2|	vips__image_pixels_quark =
  638|      2|		g_quark_from_static_string("vips-image-pixels");
  639|      2|#endif /*DEBUG_LEAK*/
  640|       |
  641|       |	/* If VIPS_WARNING is defined, suppress all warning messages from vips.
  642|       |	 *
  643|       |	 * Libraries should not call g_log_set_handler(), it is
  644|       |	 * supposed to be for the application layer, but this can be awkward to
  645|       |	 * set up if you are using libvips from something like Ruby. Allow this
  646|       |	 * env var hack as a workaround.
  647|       |	 */
  648|      2|	if (g_getenv("VIPS_WARNING")
  ------------------
  |  Branch (648:6): [True: 0, False: 2]
  ------------------
  649|       |#if ENABLE_DEPRECATED
  650|       |		|| g_getenv("IM_WARNING")
  651|       |#endif
  652|      2|	)
  653|      0|		g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
  ------------------
  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  ------------------
  654|      0|			empty_log_handler, NULL);
  655|       |
  656|       |	/* Block any untrusted operations. This must come after plugin load.
  657|       |	 */
  658|      2|	if (g_getenv("VIPS_BLOCK_UNTRUSTED"))
  ------------------
  |  Branch (658:6): [True: 0, False: 2]
  ------------------
  659|      0|		vips_block_untrusted_set(TRUE);
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  660|       |
  661|      2|	done = TRUE;
  ------------------
  |  |  798|      2|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      2|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  662|       |
  663|      2|	vips__thread_gate_stop("init: startup");
  664|       |
  665|      2|	return 0;
  666|      2|}
vips_check_init:
  672|   409k|{
  673|       |	/* Pass in a nonsense name for argv0 ... this init path is only here
  674|       |	 * for old programs which are missing an vips_init() call. We need
  675|       |	 * i18n set up before we can translate.
  676|       |	 */
  677|   409k|	if (vips_init("vips"))
  ------------------
  |  Branch (677:6): [True: 0, False: 409k]
  ------------------
  678|      0|		vips_error_clear();
  679|   409k|}
vips_thread_shutdown:
  699|  50.2k|{
  700|  50.2k|	vips__thread_profile_detach();
  701|  50.2k|	vips__buffer_shutdown();
  702|  50.2k|}
vips_guess_prefix:
 1147|      4|{
 1148|      4|	const char *prefix;
 1149|       |
 1150|       |	/* Already set?
 1151|       |	 */
 1152|      4|	if ((prefix = g_getenv(env_name)))
  ------------------
  |  Branch (1152:6): [True: 3, False: 1]
  ------------------
 1153|      3|		return prefix;
 1154|       |
 1155|       |#ifdef G_OS_WIN32
 1156|       |	prefix = vips__windows_prefix();
 1157|       |#else  /*!G_OS_WIN32*/
 1158|      1|	{
 1159|      1|		char *basename;
 1160|       |
 1161|      1|		basename = g_path_get_basename(argv0);
 1162|      1|		prefix = guess_prefix(argv0, basename);
 1163|      1|		g_free(basename);
 1164|      1|	}
 1165|      1|#endif /*G_OS_WIN32*/
 1166|       |
 1167|      1|	g_setenv(env_name, prefix, TRUE);
  ------------------
  |  |  798|      1|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      1|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1168|       |
 1169|      1|	return prefix;
 1170|      4|}
vips_guess_libdir:
 1194|      2|{
 1195|      2|	const char *prefix = vips_guess_prefix(argv0, env_name);
 1196|      2|	static char *libdir = NULL;
 1197|       |
 1198|      2|	char *suffix;
 1199|       |
 1200|      2|	if (libdir)
  ------------------
  |  Branch (1200:6): [True: 0, False: 2]
  ------------------
 1201|      0|		return libdir;
 1202|       |
 1203|       |	/* Have we been moved since configure? If not, use the configure-time
 1204|       |	 * libdir.
 1205|       |	 *
 1206|       |	 * The lib directory name can be eg. "lib", "lib64" etc. depending on
 1207|       |	 * the platform, so copy that from the configure-time libdir if we can.
 1208|       |	 * The configure-time LIBDIR is generated by autotools and always uses
 1209|       |	 * '/', even on Windows.
 1210|       |	 */
 1211|      2|	if (strcmp(prefix, VIPS_PREFIX) == 0)
  ------------------
  |  |  108|      2|#define VIPS_PREFIX "/work"
  ------------------
  |  Branch (1211:6): [True: 2, False: 0]
  ------------------
 1212|      2|		libdir = VIPS_LIBDIR;
  ------------------
  |  |  106|      2|#define VIPS_LIBDIR "/work/lib"
  ------------------
 1213|      0|	else if ((suffix = strrchr(VIPS_LIBDIR, '/')))
  ------------------
  |  |  106|      0|#define VIPS_LIBDIR "/work/lib"
  ------------------
  |  Branch (1213:11): [True: 0, False: 0]
  ------------------
 1214|      0|		libdir = g_strdup_printf("%s%s", prefix, suffix);
 1215|      0|	else
 1216|      0|		libdir = g_strdup_printf("%s/lib", prefix);
 1217|       |
 1218|      2|	return libdir;
 1219|      2|}
vips_version:
 1249|      4|{
 1250|      4|	switch (flag) {
 1251|      0|	case 0:
  ------------------
  |  Branch (1251:2): [True: 0, False: 4]
  ------------------
 1252|      0|		return VIPS_MAJOR_VERSION;
  ------------------
  |  |    9|      0|#define VIPS_MAJOR_VERSION (8)
  ------------------
 1253|       |
 1254|      0|	case 1:
  ------------------
  |  Branch (1254:2): [True: 0, False: 4]
  ------------------
 1255|      0|		return VIPS_MINOR_VERSION;
  ------------------
  |  |   10|      0|#define VIPS_MINOR_VERSION (17)
  ------------------
 1256|       |
 1257|      0|	case 2:
  ------------------
  |  Branch (1257:2): [True: 0, False: 4]
  ------------------
 1258|      0|		return VIPS_MICRO_VERSION;
  ------------------
  |  |   11|      0|#define VIPS_MICRO_VERSION (0)
  ------------------
 1259|       |
 1260|      2|	case 3:
  ------------------
  |  Branch (1260:2): [True: 2, False: 2]
  ------------------
 1261|      2|		return VIPS_LIBRARY_CURRENT;
  ------------------
  |  |   15|      2|#define VIPS_LIBRARY_CURRENT (61)
  ------------------
 1262|       |
 1263|      0|	case 4:
  ------------------
  |  Branch (1263:2): [True: 0, False: 4]
  ------------------
 1264|      0|		return VIPS_LIBRARY_REVISION;
  ------------------
  |  |   16|      0|#define VIPS_LIBRARY_REVISION (0)
  ------------------
 1265|       |
 1266|      2|	case 5:
  ------------------
  |  Branch (1266:2): [True: 2, False: 2]
  ------------------
 1267|      2|		return VIPS_LIBRARY_AGE;
  ------------------
  |  |   17|      2|#define VIPS_LIBRARY_AGE (19)
  ------------------
 1268|       |
 1269|      0|	default:
  ------------------
  |  Branch (1269:2): [True: 0, False: 4]
  ------------------
 1270|      0|		vips_error("vips_version", "%s", _("flag not in [0, 5]"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1271|      0|		return -1;
 1272|      4|	}
 1273|      4|}
init.c:set_stacksize:
  337|      2|{
  338|      2|#ifdef HAVE_PTHREAD_DEFAULT_NP
  339|      2|	pthread_attr_t attr;
  340|      2|	size_t cur_stack_size;
  341|       |
  342|       |	/* Don't allow stacks less than 2mb.
  343|       |	 */
  344|      2|	size = VIPS_MAX(size, 2 * 1024 * 1024);
  ------------------
  |  |   54|      2|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  345|       |
  346|      2|	if (pthread_attr_init(&attr) ||
  ------------------
  |  Branch (346:6): [True: 0, False: 2]
  ------------------
  347|      2|		pthread_attr_getstacksize(&attr, &cur_stack_size)) {
  ------------------
  |  Branch (347:3): [True: 0, False: 2]
  ------------------
  348|      0|		g_warning("set_stacksize: unable to get stack size");
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  349|      0|		pthread_attr_destroy(&attr);
  350|      0|		return;
  351|      0|	}
  352|       |
  353|      2|	if (cur_stack_size < size) {
  ------------------
  |  Branch (353:6): [True: 0, False: 2]
  ------------------
  354|      0|		if (pthread_attr_setstacksize(&attr, size) ||
  ------------------
  |  Branch (354:7): [True: 0, False: 0]
  ------------------
  355|      0|			pthread_setattr_default_np(&attr))
  ------------------
  |  Branch (355:4): [True: 0, False: 0]
  ------------------
  356|      0|			g_warning("set_stacksize: unable to set stack size");
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  357|      0|		else
  358|      0|			g_info("set stack size to %" G_GUINT64_FORMAT "k",
  ------------------
  |  |  341|      0|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      0|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      0|                               __VA_ARGS__)
  ------------------
  359|      0|				size / (guint64) 1024);
  360|      0|	}
  361|       |
  362|      2|	pthread_attr_destroy(&attr);
  363|      2|#endif /*HAVE_PTHREAD_DEFAULT_NP*/
  364|      2|}
init.c:guess_prefix:
 1063|      1|{
 1064|      1|	char *prefix;
 1065|       |
 1066|       |	/* We've already checked for VIPSHOME. If the configure-time
 1067|       |	 * library prefix looks OK, use the configure-time prefix.
 1068|       |	 */
 1069|      1|	if (vips_existsf("%s/vips-modules-%d.%d",
  ------------------
  |  Branch (1069:6): [True: 0, False: 1]
  ------------------
 1070|      1|			VIPS_LIBDIR, VIPS_MAJOR_VERSION, VIPS_MINOR_VERSION)) {
  ------------------
  |  |  106|      1|#define VIPS_LIBDIR "/work/lib"
  ------------------
              			VIPS_LIBDIR, VIPS_MAJOR_VERSION, VIPS_MINOR_VERSION)) {
  ------------------
  |  |    9|      1|#define VIPS_MAJOR_VERSION (8)
  ------------------
              			VIPS_LIBDIR, VIPS_MAJOR_VERSION, VIPS_MINOR_VERSION)) {
  ------------------
  |  |   10|      1|#define VIPS_MINOR_VERSION (17)
  ------------------
 1071|      0|		g_info("found %s/vips-modules-%d.%d",
  ------------------
  |  |  341|      0|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      0|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      0|                               __VA_ARGS__)
  ------------------
 1072|      0|			VIPS_LIBDIR, VIPS_MAJOR_VERSION, VIPS_MINOR_VERSION);
 1073|      0|		g_info("using configure-time prefix");
  ------------------
  |  |  341|      0|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      0|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      0|                               __VA_ARGS__)
  ------------------
 1074|      0|		return VIPS_PREFIX;
  ------------------
  |  |  108|      0|#define VIPS_PREFIX "/work"
  ------------------
 1075|      0|	}
 1076|       |
 1077|       |	/* Try to guess from argv0.
 1078|       |	 */
 1079|      1|	if (argv0) {
  ------------------
  |  Branch (1079:6): [True: 1, False: 0]
  ------------------
 1080|      1|		if (g_path_is_absolute(argv0)) {
  ------------------
  |  Branch (1080:7): [True: 1, False: 0]
  ------------------
 1081|       |			/* Must point to our executable.
 1082|       |			 */
 1083|      1|			if ((prefix = extract_prefix(argv0, name))) {
  ------------------
  |  Branch (1083:8): [True: 0, False: 1]
  ------------------
 1084|      0|				g_info("found \"%s\" from argv0", prefix);
  ------------------
  |  |  341|      0|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      0|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      0|                               __VA_ARGS__)
  ------------------
 1085|      0|				return prefix;
 1086|      0|			}
 1087|      1|		}
 1088|       |
 1089|       |		/* Look along path for name.
 1090|       |		 */
 1091|      1|		if ((prefix = find_file(name))) {
  ------------------
  |  Branch (1091:7): [True: 0, False: 1]
  ------------------
 1092|      0|			g_info("found \"%s\" from PATH", prefix);
  ------------------
  |  |  341|      0|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      0|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      0|                               __VA_ARGS__)
  ------------------
 1093|      0|			return prefix;
 1094|      0|		}
 1095|      1|	}
 1096|       |
 1097|       |	/* Try to guess from cwd. Only if this is a relative path, though.
 1098|       |	 */
 1099|      1|	if (argv0 &&
  ------------------
  |  Branch (1099:6): [True: 1, False: 0]
  ------------------
 1100|      1|		!g_path_is_absolute(argv0)) {
  ------------------
  |  Branch (1100:3): [True: 0, False: 1]
  ------------------
 1101|      0|		char *dir;
 1102|      0|		char full_path[VIPS_PATH_MAX];
 1103|      0|		char *resolved;
 1104|       |
 1105|      0|		dir = g_get_current_dir();
 1106|      0|		g_snprintf(full_path, VIPS_PATH_MAX,
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 1107|      0|			"%s" G_DIR_SEPARATOR_S "%s", dir, argv0);
 1108|      0|		g_free(dir);
 1109|       |
 1110|      0|		if ((resolved = vips_realpath(full_path))) {
  ------------------
  |  Branch (1110:7): [True: 0, False: 0]
  ------------------
 1111|      0|			prefix = extract_prefix(resolved, name);
 1112|      0|			g_free(resolved);
 1113|       |
 1114|      0|			if (prefix) {
  ------------------
  |  Branch (1114:8): [True: 0, False: 0]
  ------------------
 1115|      0|				g_info("found \"%s\" from cwd", prefix);
  ------------------
  |  |  341|      0|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      0|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      0|                               __VA_ARGS__)
  ------------------
 1116|      0|				return prefix;
 1117|      0|			}
 1118|      0|		}
 1119|      0|	}
 1120|       |
 1121|       |	/* Fall back to the configure-time prefix.
 1122|       |	 */
 1123|      1|	return VIPS_PREFIX;
  ------------------
  |  |  108|      1|#define VIPS_PREFIX "/work"
  ------------------
 1124|      1|}
init.c:extract_prefix:
  941|      1|{
  942|      1|	char edir[VIPS_PATH_MAX];
  943|      1|	static char vname[VIPS_PATH_MAX];
  944|      1|	int i;
  945|       |
  946|      1|	g_info("trying for dir = \"%s\", name = \"%s\"", dir, name);
  ------------------
  |  |  341|      1|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      1|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      1|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      1|                               __VA_ARGS__)
  ------------------
  947|       |
  948|       |	/* Is dir relative? Prefix with cwd.
  949|       |	 */
  950|      1|	if (!g_path_is_absolute(dir)) {
  ------------------
  |  Branch (950:6): [True: 0, False: 1]
  ------------------
  951|      0|		char *cwd;
  952|       |
  953|      0|		cwd = g_get_current_dir();
  954|      0|		g_snprintf(edir, VIPS_PATH_MAX,
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
  955|      0|			"%s" G_DIR_SEPARATOR_S "%s", cwd, dir);
  956|      0|		g_free(cwd);
  957|      0|	}
  958|      1|	else {
  959|      1|		g_strlcpy(edir, dir, VIPS_PATH_MAX);
  ------------------
  |  |  245|      1|#define VIPS_PATH_MAX (4096)
  ------------------
  960|      1|	}
  961|       |
  962|       |	/* Chop off the trailing prog name, plus the trailing
  963|       |	 * G_DIR_SEPARATOR_S.
  964|       |	 */
  965|      1|	if (!g_str_has_suffix(edir, name))
  ------------------
  |  Branch (965:6): [True: 0, False: 1]
  ------------------
  966|      0|		return NULL;
  967|      1|	g_strlcpy(vname, edir, VIPS_PATH_MAX);
  ------------------
  |  |  245|      1|#define VIPS_PATH_MAX (4096)
  ------------------
  968|      1|	vname[strlen(edir) - strlen(name) - 1] = '\0';
  969|       |
  970|       |	/* Remove any "/./", any trailing "/.", any trailing "/".
  971|       |	 */
  972|     41|	for (i = 0; i < (int) strlen(vname); i++)
  ------------------
  |  Branch (972:14): [True: 40, False: 1]
  ------------------
  973|     40|		if (vips_isprefix(G_DIR_SEPARATOR_S "." G_DIR_SEPARATOR_S,
  ------------------
  |  Branch (973:7): [True: 0, False: 40]
  ------------------
  974|     40|				vname + i))
  975|      0|			memmove(vname + i, vname + i + 2,
  976|      0|				strlen(vname + i + 2) + 1);
  977|      1|	if (g_str_has_suffix(vname, G_DIR_SEPARATOR_S "."))
  ------------------
  |  Branch (977:6): [True: 0, False: 1]
  ------------------
  978|      0|		vname[strlen(vname) - 2] = '\0';
  979|      1|	if (g_str_has_suffix(vname, G_DIR_SEPARATOR_S))
  ------------------
  |  Branch (979:6): [True: 0, False: 1]
  ------------------
  980|      0|		vname[strlen(vname) - 1] = '\0';
  981|       |
  982|      1|	g_info("canonicalised path = \"%s\"", vname);
  ------------------
  |  |  341|      1|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      1|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      1|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      1|                               __VA_ARGS__)
  ------------------
  983|       |
  984|       |	/* Ought to be a "/bin" at the end now.
  985|       |	 */
  986|      1|	if (!g_str_has_suffix(vname, G_DIR_SEPARATOR_S "bin"))
  ------------------
  |  Branch (986:6): [True: 1, False: 0]
  ------------------
  987|      1|		return NULL;
  988|      0|	vname[strlen(vname) - strlen(G_DIR_SEPARATOR_S "bin")] = '\0';
  989|       |
  990|      0|	g_info("found \"%s\"", vname);
  ------------------
  |  |  341|      0|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      0|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      0|                               __VA_ARGS__)
  ------------------
  991|       |
  992|      0|	return vname;
  993|      1|}
init.c:find_file:
 1028|      1|{
 1029|      1|	const char *path = g_getenv("PATH");
 1030|      1|	char *prefix;
 1031|      1|	char full_path[VIPS_PATH_MAX];
 1032|       |
 1033|      1|	if (!path)
  ------------------
  |  Branch (1033:6): [True: 0, False: 1]
  ------------------
 1034|      0|		return NULL;
 1035|       |
 1036|      1|	g_info("g_getenv(\"PATH\") == \"%s\"", path);
  ------------------
  |  |  341|      1|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      1|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      1|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      1|                               __VA_ARGS__)
  ------------------
 1037|       |
 1038|       |#ifdef G_OS_WIN32
 1039|       |	{
 1040|       |		char *dir;
 1041|       |
 1042|       |		/* Windows always searches '.' first, so prepend cwd to path.
 1043|       |		 */
 1044|       |		dir = g_get_current_dir();
 1045|       |		g_snprintf(full_path, VIPS_PATH_MAX,
 1046|       |			"%s" G_SEARCHPATH_SEPARATOR_S "%s", dir, path);
 1047|       |		g_free(dir);
 1048|       |	}
 1049|       |#else  /*!G_OS_WIN32*/
 1050|      1|	g_strlcpy(full_path, path, VIPS_PATH_MAX);
  ------------------
  |  |  245|      1|#define VIPS_PATH_MAX (4096)
  ------------------
 1051|      1|#endif /*G_OS_WIN32*/
 1052|       |
 1053|      1|	if ((prefix = scan_path(full_path, name)))
  ------------------
  |  Branch (1053:6): [True: 0, False: 1]
  ------------------
 1054|      0|		return prefix;
 1055|       |
 1056|      1|	return NULL;
 1057|      1|}
init.c:scan_path:
  999|      1|{
 1000|      1|	char *p, *q;
 1001|      1|	char *prefix;
 1002|       |
 1003|      1|	for (p = path;
 1004|     11|		 (q = vips_break_token(p, G_SEARCHPATH_SEPARATOR_S)); p = q) {
  ------------------
  |  Branch (1004:4): [True: 10, False: 1]
  ------------------
 1005|     10|		char str[VIPS_PATH_MAX];
 1006|       |
 1007|       |		/* Form complete path.
 1008|       |		 */
 1009|     10|		g_snprintf(str, VIPS_PATH_MAX,
  ------------------
  |  |  245|     10|#define VIPS_PATH_MAX (4096)
  ------------------
 1010|     10|			"%s" G_DIR_SEPARATOR_S "%s", p, name);
 1011|       |
 1012|     10|		g_info("looking in \"%s\" for \"%s\"",
  ------------------
  |  |  341|     10|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|     10|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|     10|                               G_LOG_LEVEL_INFO,     \
  |  |  343|     10|                               __VA_ARGS__)
  ------------------
 1013|     10|			p, name);
 1014|       |
 1015|     10|		if (vips_existsf("%s", str) &&
  ------------------
  |  Branch (1015:7): [True: 0, False: 10]
  ------------------
 1016|     10|			(prefix = extract_prefix(str, name))) {
  ------------------
  |  Branch (1016:4): [True: 0, False: 0]
  ------------------
 1017|      0|			return prefix;
 1018|      0|		}
 1019|     10|	}
 1020|       |
 1021|      1|	return NULL;
 1022|      1|}

vips_malloc:
  177|  1.68M|{
  178|  1.68M|	void *buf;
  179|       |
  180|  1.68M|	buf = g_malloc0(size);
  181|       |
  182|  1.68M|	if (object) {
  ------------------
  |  Branch (182:6): [True: 45.1k, False: 1.64M]
  ------------------
  183|  45.1k|		g_signal_connect(object, "postclose",
  ------------------
  |  |  491|  45.1k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  184|  45.1k|			G_CALLBACK(vips_malloc_cb), buf);
  185|  45.1k|		object->local_memory += size;
  186|  45.1k|	}
  187|       |
  188|  1.68M|	return buf;
  189|  1.68M|}
vips_strdup:
  208|     53|{
  209|     53|	char *str_dup;
  210|       |
  211|     53|	str_dup = g_strdup(str);
  212|       |
  213|     53|	if (object) {
  ------------------
  |  Branch (213:6): [True: 53, False: 0]
  ------------------
  214|     53|		g_signal_connect(object, "postclose",
  ------------------
  |  |  491|     53|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  215|     53|			G_CALLBACK(vips_malloc_cb), str_dup);
  216|     53|		object->local_memory += strlen(str);
  217|     53|	}
  218|       |
  219|     53|	return str_dup;
  220|     53|}
vips_tracked_free:
  234|  19.9k|{
  235|       |	/* Keep the size of the alloc in the previous 16 bytes. Ensures
  236|       |	 * alignment rules are kept.
  237|       |	 */
  238|  19.9k|	void *start = (void *) ((char *) s - 16);
  239|  19.9k|	size_t size = *((size_t *) start);
  240|       |
  241|  19.9k|	g_mutex_lock(&vips_tracked_mutex);
  242|       |
  243|       |#ifdef DEBUG_VERBOSE_MEM
  244|       |	printf("vips_tracked_free: %p, %zd bytes\n", s, size);
  245|       |#endif /*DEBUG_VERBOSE_MEM*/
  246|       |
  247|  19.9k|	if (vips_tracked_allocs <= 0)
  ------------------
  |  Branch (247:6): [True: 0, False: 19.9k]
  ------------------
  248|      0|		g_warning("%s", _("vips_free: too many frees"));
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  249|  19.9k|	if (vips_tracked_mem < size)
  ------------------
  |  Branch (249:6): [True: 0, False: 19.9k]
  ------------------
  250|      0|		g_warning("%s", _("vips_free: too much free"));
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  251|       |
  252|  19.9k|	vips_tracked_mem -= size;
  253|  19.9k|	vips_tracked_allocs -= 1;
  254|       |
  255|  19.9k|	g_mutex_unlock(&vips_tracked_mutex);
  256|       |
  257|  19.9k|	g_free(start);
  258|       |
  259|  19.9k|	VIPS_GATE_FREE(size);
  ------------------
  |  |   65|  19.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   66|  19.9k|	{ \
  |  |   67|  19.9k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (67:7): [True: 0, False: 19.9k]
  |  |  ------------------
  |  |   68|  19.9k|			vips__thread_malloc_free(-((gint64) (SIZE))); \
  |  |   69|  19.9k|	} \
  |  |   70|  19.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  260|  19.9k|}
vips_tracked_aligned_free:
  274|   263k|{
  275|   263k|	void *start = (size_t *) s - 1;
  276|   263k|	size_t size = *((size_t *) start);
  277|       |
  278|   263k|	g_mutex_lock(&vips_tracked_mutex);
  279|       |
  280|       |#ifdef DEBUG_VERBOSE
  281|       |	printf("vips_tracked_aligned_free: %p, %zd bytes\n", s, size);
  282|       |#endif /*DEBUG_VERBOSE*/
  283|       |
  284|   263k|	if (vips_tracked_allocs <= 0)
  ------------------
  |  Branch (284:6): [True: 0, False: 263k]
  ------------------
  285|      0|		g_warning("%s", _("vips_free: too many frees"));
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  286|   263k|	if (vips_tracked_mem < size)
  ------------------
  |  Branch (286:6): [True: 0, False: 263k]
  ------------------
  287|      0|		g_warning("%s", _("vips_free: too much free"));
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  288|       |
  289|   263k|	vips_tracked_mem -= size;
  290|   263k|	vips_tracked_allocs -= 1;
  291|       |
  292|   263k|	g_mutex_unlock(&vips_tracked_mutex);
  293|       |
  294|       |#ifdef HAVE__ALIGNED_MALLOC
  295|       |	_aligned_free(start);
  296|       |#else /*defined(HAVE_POSIX_MEMALIGN) || defined(HAVE_MEMALIGN)*/
  297|   263k|	free(start);
  298|   263k|#endif
  299|       |
  300|   263k|	VIPS_GATE_FREE(size);
  ------------------
  |  |   65|   263k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   263k|#define G_STMT_START  do
  |  |  ------------------
  |  |   66|   263k|	{ \
  |  |   67|   263k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (67:7): [True: 0, False: 263k]
  |  |  ------------------
  |  |   68|   263k|			vips__thread_malloc_free(-((gint64) (SIZE))); \
  |  |   69|   263k|	} \
  |  |   70|   263k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   263k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  301|   263k|}
vips_tracked_malloc:
  321|  19.9k|{
  322|  19.9k|	void *buf;
  323|       |
  324|       |	/* Need an extra sizeof(size_t) bytes to track
  325|       |	 * size of this block. Ask for an extra 16 to make sure we don't break
  326|       |	 * alignment rules.
  327|       |	 */
  328|  19.9k|	size += 16;
  329|       |
  330|  19.9k|	if (!(buf = g_try_malloc0(size))) {
  ------------------
  |  Branch (330:6): [True: 0, False: 19.9k]
  ------------------
  331|       |#ifdef DEBUG
  332|       |		g_assert_not_reached();
  333|       |#endif /*DEBUG*/
  334|       |
  335|      0|		vips_error("vips_tracked",
  336|      0|			_("out of memory --- size == %dMB"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  337|      0|			(int) (size / (1024.0 * 1024.0)));
  338|      0|		g_warning(_("out of memory --- size == %dMB"),
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  339|      0|			(int) (size / (1024.0 * 1024.0)));
  340|       |
  341|      0|		return NULL;
  342|      0|	}
  343|       |
  344|  19.9k|	g_mutex_lock(&vips_tracked_mutex);
  345|       |
  346|  19.9k|	*((size_t *) buf) = size;
  347|  19.9k|	buf = (void *) ((char *) buf + 16);
  348|       |
  349|  19.9k|	vips_tracked_mem += size;
  350|  19.9k|	if (vips_tracked_mem > vips_tracked_mem_highwater)
  ------------------
  |  Branch (350:6): [True: 26, False: 19.9k]
  ------------------
  351|     26|		vips_tracked_mem_highwater = vips_tracked_mem;
  352|  19.9k|	vips_tracked_allocs += 1;
  353|       |
  354|       |#ifdef DEBUG_VERBOSE_MEM
  355|       |	printf("vips_tracked_malloc: %p, %zd bytes\n", buf, size);
  356|       |#endif /*DEBUG_VERBOSE_MEM*/
  357|       |
  358|  19.9k|	g_mutex_unlock(&vips_tracked_mutex);
  359|       |
  360|  19.9k|	VIPS_GATE_MALLOC(size);
  ------------------
  |  |   57|  19.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  19.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   58|  19.9k|	{ \
  |  |   59|  19.9k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (59:7): [True: 0, False: 19.9k]
  |  |  ------------------
  |  |   60|  19.9k|			vips__thread_malloc_free((gint64) (SIZE)); \
  |  |   61|  19.9k|	} \
  |  |   62|  19.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  361|       |
  362|  19.9k|	return buf;
  363|  19.9k|}
vips_tracked_aligned_alloc:
  385|   263k|{
  386|   263k|	void *buf;
  387|       |
  388|   263k|	g_assert(!(align & (align - 1)));
  ------------------
  |  |  166|   263k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   263k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   263k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  389|       |
  390|       |	/* Need an extra sizeof(size_t) bytes to track
  391|       |	 * size of this block.
  392|       |	 */
  393|   263k|	size += sizeof(size_t);
  394|       |
  395|       |#ifdef HAVE__ALIGNED_MALLOC
  396|       |	if (!(buf = _aligned_malloc(size, align))) {
  397|       |#elif defined(HAVE_POSIX_MEMALIGN)
  398|   263k|	if (posix_memalign(&buf, align, size)) {
  ------------------
  |  Branch (398:6): [True: 0, False: 263k]
  ------------------
  399|       |#elif defined(HAVE_MEMALIGN)
  400|       |	if (!(buf = memalign(align, size))) {
  401|       |#else
  402|       |#error Missing aligned alloc implementation
  403|       |#endif
  404|       |#ifdef DEBUG
  405|       |		g_assert_not_reached();
  406|       |#endif /*DEBUG*/
  407|       |
  408|      0|		vips_error("vips_tracked",
  409|      0|			_("out of memory --- size == %dMB"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  410|      0|			(int) (size / (1024.0 * 1024.0)));
  411|      0|		g_warning(_("out of memory --- size == %dMB"),
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  412|      0|			(int) (size / (1024.0 * 1024.0)));
  413|       |
  414|      0|		return NULL;
  415|      0|	}
  416|       |
  417|   263k|	memset(buf, 0, size);
  418|       |
  419|   263k|	g_mutex_lock(&vips_tracked_mutex);
  420|       |
  421|   263k|	*((size_t *) buf) = size;
  422|       |
  423|   263k|	vips_tracked_mem += size;
  424|   263k|	if (vips_tracked_mem > vips_tracked_mem_highwater)
  ------------------
  |  Branch (424:6): [True: 192, False: 263k]
  ------------------
  425|    192|		vips_tracked_mem_highwater = vips_tracked_mem;
  426|   263k|	vips_tracked_allocs += 1;
  427|       |
  428|       |#ifdef DEBUG_VERBOSE
  429|       |	printf("vips_tracked_aligned_alloc: %p, %zd bytes\n", buf, size);
  430|       |#endif /*DEBUG_VERBOSE*/
  431|       |
  432|   263k|	g_mutex_unlock(&vips_tracked_mutex);
  433|       |
  434|   263k|	VIPS_GATE_MALLOC(size);
  ------------------
  |  |   57|   263k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   263k|#define G_STMT_START  do
  |  |  ------------------
  |  |   58|   263k|	{ \
  |  |   59|   263k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (59:7): [True: 0, False: 263k]
  |  |  ------------------
  |  |   60|   263k|			vips__thread_malloc_free((gint64) (SIZE)); \
  |  |   61|   263k|	} \
  |  |   62|   263k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   263k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  435|       |
  436|   263k|	return (void *) ((size_t *) buf + 1);
  437|   263k|}
vips_tracked_get_mem:
  530|   165k|{
  531|   165k|	size_t mem;
  532|       |
  533|   165k|	g_mutex_lock(&vips_tracked_mutex);
  534|       |
  535|   165k|	mem = vips_tracked_mem;
  536|       |
  537|   165k|	g_mutex_unlock(&vips_tracked_mutex);
  538|       |
  539|   165k|	return mem;
  540|   165k|}
vips_tracked_get_files:
  595|   165k|{
  596|   165k|	int n;
  597|       |
  598|   165k|	g_mutex_lock(&vips_tracked_mutex);
  599|       |
  600|   165k|	n = vips_tracked_files;
  601|       |
  602|   165k|	g_mutex_unlock(&vips_tracked_mutex);
  603|       |
  604|   165k|	return n;
  605|   165k|}
memory.c:vips_malloc_cb:
  155|  45.1k|{
  156|  45.1k|	g_free(buf);
  157|  45.1k|}

vips_argument_get_id:
  239|    864|{
  240|    864|	int id;
  241|       |
  242|       |	/* We probably don't need to lock: glib seems to single-thread class
  243|       |	 * creation.
  244|       |	 */
  245|    864|	id = _vips__argument_id++;
  246|       |
  247|    864|	return id;
  248|    864|}
vips_object_preclose:
  270|  1.37M|{
  271|  1.37M|	if (!object->preclose) {
  ------------------
  |  Branch (271:6): [True: 837k, False: 535k]
  ------------------
  272|   837k|		object->preclose = TRUE;
  ------------------
  |  |  798|   837k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   837k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  273|       |
  274|       |#ifdef DEBUG
  275|       |		printf("vips_object_preclose: ");
  276|       |		vips_object_print_name(object);
  277|       |		printf("\n");
  278|       |#endif /*DEBUG*/
  279|       |
  280|   837k|		g_signal_emit(object, vips_object_signals[SIG_PRECLOSE], 0);
  281|   837k|	}
  282|  1.37M|}
vips_object_build:
  356|   829k|{
  357|   829k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|   829k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|   829k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   829k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  358|       |
  359|       |	/* Input and output args must both be set.
  360|       |	 */
  361|   829k|	VipsArgumentFlags iomask = VIPS_ARGUMENT_INPUT | VIPS_ARGUMENT_OUTPUT;
  362|       |
  363|   829k|	int result;
  364|       |
  365|       |#ifdef DEBUG
  366|       |	printf("vips_object_build: ");
  367|       |	vips_object_print_name(object);
  368|       |	printf("\n");
  369|       |#endif /*DEBUG*/
  370|       |
  371|   829k|	if (class->build(object))
  ------------------
  |  Branch (371:6): [True: 10.1k, False: 819k]
  ------------------
  372|  10.1k|		return -1;
  373|       |
  374|       |	/* Check all required arguments have been supplied, don't stop on 1st
  375|       |	 * error.
  376|       |	 */
  377|   819k|	result = 0;
  378|   819k|	(void) vips_argument_map(object,
  379|   819k|		vips_object_check_required, &result, &iomask);
  380|       |
  381|       |	/* ... more checks go here.
  382|       |	 */
  383|   819k|	object->constructed = TRUE;
  ------------------
  |  |  798|   819k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   819k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  384|       |
  385|       |	/* Only postbuild on success.
  386|       |	 */
  387|   819k|	if (!result)
  ------------------
  |  Branch (387:6): [True: 819k, False: 0]
  ------------------
  388|   819k|		result = vips_object_postbuild(object);
  389|       |
  390|   819k|	return result;
  391|   829k|}
vips__argument_table_lookup:
  558|  58.5M|{
  559|  58.5M|	VipsArgument *argument;
  560|       |
  561|  58.5M|	g_mutex_lock(&vips__global_lock);
  562|  58.5M|	argument = (VipsArgument *) g_hash_table_lookup(table, pspec);
  563|  58.5M|	g_mutex_unlock(&vips__global_lock);
  564|       |
  565|  58.5M|	return argument;
  566|  58.5M|}
vips_argument_map:
  596|  3.96M|{
  597|       |	/* Make sure we can't go during the loop. This can happen if eg. we
  598|       |	 * flush an arg that refs us.
  599|       |	 */
  600|  3.96M|	g_object_ref(object);
  601|       |
  602|  31.7M|	VIPS_ARGUMENT_FOR_ALL(object,
  ------------------
  |  |  358|  3.96M|	{ \
  |  |  359|  3.96M|		VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(OBJECT); \
  |  |  ------------------
  |  |  |  |  441|  3.96M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  527|  3.96M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2310|  3.96M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  360|  3.96M|		GSList *p; \
  |  |  361|  3.96M|\
  |  |  362|  35.7M|		for (p = object_class->argument_table_traverse; p; p = p->next) { \
  |  |  ------------------
  |  |  |  Branch (362:51): [True: 31.7M, False: 3.96M]
  |  |  ------------------
  |  |  363|  31.7M|			VipsArgumentClass *ARG_CLASS = \
  |  |  364|  31.7M|				(VipsArgumentClass *) p->data; \
  |  |  365|  31.7M|			VipsArgument *argument = (VipsArgument *) argument_class; \
  |  |  366|  31.7M|			GParamSpec *PSPEC = argument->pspec; \
  |  |  367|  31.7M|			VipsArgumentInstance *ARG_INSTANCE G_GNUC_UNUSED = \
  |  |  368|  31.7M|				vips__argument_get_instance(argument_class, \
  |  |  369|  31.7M|					VIPS_OBJECT(OBJECT));
  |  |  ------------------
  |  |  |  |  433|  31.7M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  31.7M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  31.7M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  603|  31.7M|		pspec, argument_class, argument_instance)
  604|  31.7M|	{
  605|  31.7M|		void *result;
  606|       |
  607|       |		/* argument_instance should not be NULL.
  608|       |		 */
  609|  31.7M|		g_assert(argument_instance);
  ------------------
  |  |  166|  31.7M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  31.7M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  31.7M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  610|       |
  611|  31.7M|		if ((result = fn(object, pspec,
  ------------------
  |  Branch (611:7): [True: 1.62k, False: 31.7M]
  ------------------
  612|  31.7M|				 argument_class, argument_instance, a, b))) {
  613|  1.62k|			g_object_unref(object);
  614|  1.62k|			return result;
  615|  1.62k|		}
  616|  31.7M|	}
  617|  31.7M|	VIPS_ARGUMENT_FOR_ALL_END
  ------------------
  |  |  372|  31.7M|	} \
  |  |  373|  3.96M|	}
  ------------------
  618|       |
  619|  3.96M|	g_object_unref(object);
  620|       |
  621|  3.96M|	return NULL;
  622|  3.96M|}
vips__argument_get_instance:
  750|  50.1M|{
  751|       |	/* Make sure the instance args are built.
  752|       |	 */
  753|  50.1M|	vips_argument_init(object);
  754|       |
  755|  50.1M|	return (VipsArgumentInstance *)
  756|  50.1M|		vips__argument_table_lookup(object->argument_table,
  757|  50.1M|			((VipsArgument *) argument_class)->pspec);
  758|  50.1M|}
vips_object_get_argument:
  777|  1.08M|{
  778|  1.08M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  1.08M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  1.08M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  1.08M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  779|       |
  780|  1.08M|	if (!(*pspec = g_object_class_find_property(G_OBJECT_CLASS(class), name))) {
  ------------------
  |  |   58|  1.08M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.08M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.08M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (780:6): [True: 0, False: 1.08M]
  ------------------
  781|      0|		vips_error(class->nickname, _("no property named `%s'"), name);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  782|      0|		return -1;
  783|      0|	}
  784|       |
  785|  1.08M|	if (!(*argument_class = (VipsArgumentClass *)
  ------------------
  |  Branch (785:6): [True: 0, False: 1.08M]
  ------------------
  786|  1.08M|			vips__argument_table_lookup(class->argument_table, *pspec))) {
  787|      0|		vips_error(class->nickname, _("no vips argument named `%s'"), name);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  788|      0|		return -1;
  789|      0|	}
  790|       |
  791|  1.08M|	if (!(*argument_instance = vips__argument_get_instance(
  ------------------
  |  Branch (791:6): [True: 0, False: 1.08M]
  ------------------
  792|  1.08M|		  *argument_class, object))) {
  793|      0|		vips_error(class->nickname, _("argument `%s' has no instance"), name);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  794|      0|		return -1;
  795|      0|	}
  796|       |
  797|  1.08M|	return 0;
  798|  1.08M|}
vips_object_argument_isset:
  811|   434k|{
  812|   434k|	GParamSpec *pspec;
  813|   434k|	VipsArgumentClass *argument_class;
  814|   434k|	VipsArgumentInstance *argument_instance;
  815|       |
  816|   434k|	if (vips_object_get_argument(object, name,
  ------------------
  |  Branch (816:6): [True: 0, False: 434k]
  ------------------
  817|   434k|			&pspec, &argument_class, &argument_instance))
  818|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  819|       |
  820|   434k|	return argument_instance->assigned;
  821|   434k|}
vips__object_set_member:
 1088|   779k|{
 1089|   779k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|   779k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|   779k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   779k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1090|   779k|	VipsArgumentClass *argument_class = (VipsArgumentClass *)
 1091|   779k|		vips__argument_table_lookup(class->argument_table, pspec);
 1092|   779k|	VipsArgumentInstance *argument_instance =
 1093|   779k|		vips__argument_get_instance(argument_class, object);
 1094|   779k|	GType otype = G_PARAM_SPEC_VALUE_TYPE(pspec);
  ------------------
  |  |  103|   779k|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|   779k|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|   779k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|   779k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1095|       |
 1096|   779k|	g_assert(argument_instance);
  ------------------
  |  |  166|   779k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   779k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   779k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1097|       |
 1098|   779k|	vips_object_clear_member(argument_instance);
 1099|       |
 1100|   779k|	g_assert(!*member);
  ------------------
  |  |  166|   779k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   779k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   779k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1101|   779k|	*member = argument;
 1102|       |
 1103|   779k|	if (*member) {
  ------------------
  |  Branch (1103:6): [True: 309k, False: 469k]
  ------------------
 1104|   309k|		if (argument_class->flags & VIPS_ARGUMENT_INPUT) {
  ------------------
  |  Branch (1104:7): [True: 158k, False: 151k]
  ------------------
 1105|       |#ifdef DEBUG_REF
 1106|       |			printf("vips__object_set_member: vips object: ");
 1107|       |			vips_object_print_name(object);
 1108|       |			printf("  refers to gobject %s (%p)\n",
 1109|       |				G_OBJECT_TYPE_NAME(*member), *member);
 1110|       |			printf("  count up to %d\n", G_OBJECT(*member)->ref_count);
 1111|       |#endif /*DEBUG_REF*/
 1112|       |
 1113|       |			/* Ref the argument.
 1114|       |			 */
 1115|   158k|			g_object_ref(*member);
 1116|   158k|		}
 1117|   151k|		else if (argument_class->flags & VIPS_ARGUMENT_OUTPUT) {
  ------------------
  |  Branch (1117:12): [True: 151k, False: 0]
  ------------------
 1118|       |#ifdef DEBUG_REF
 1119|       |			printf("vips__object_set_member: gobject %s (%p)\n",
 1120|       |				G_OBJECT_TYPE_NAME(*member), *member);
 1121|       |			printf("  refers to vips object: ");
 1122|       |			vips_object_print_name(object);
 1123|       |			printf("  count up to %d\n", G_OBJECT(object)->ref_count);
 1124|       |#endif /*DEBUG_REF*/
 1125|       |
 1126|       |			/* The argument reffs us.
 1127|       |			 */
 1128|   151k|			g_object_ref(object);
 1129|   151k|		}
 1130|   309k|	}
 1131|       |
 1132|   779k|	if (*member &&
  ------------------
  |  Branch (1132:6): [True: 309k, False: 469k]
  ------------------
 1133|   779k|		g_type_is_a(otype, VIPS_TYPE_IMAGE)) {
  ------------------
  |  |  169|   309k|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  ------------------
  |  Branch (1133:3): [True: 296k, False: 13.4k]
  ------------------
 1134|   296k|		if (argument_class->flags & VIPS_ARGUMENT_INPUT) {
  ------------------
  |  Branch (1134:7): [True: 145k, False: 151k]
  ------------------
 1135|   145k|			g_assert(!argument_instance->invalidate_id);
  ------------------
  |  |  166|   145k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   145k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   145k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1136|       |
 1137|   145k|			argument_instance->invalidate_id =
 1138|   145k|				g_signal_connect(*member, "invalidate",
  ------------------
  |  |  491|   145k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
 1139|   145k|					G_CALLBACK(vips_object_arg_invalidate),
 1140|   145k|					argument_instance);
 1141|   145k|		}
 1142|   151k|		else if (argument_class->flags & VIPS_ARGUMENT_OUTPUT) {
  ------------------
  |  Branch (1142:12): [True: 151k, False: 0]
  ------------------
 1143|   151k|			g_assert(!argument_instance->close_id);
  ------------------
  |  |  166|   151k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   151k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   151k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1144|       |
 1145|   151k|			argument_instance->close_id =
 1146|   151k|				g_signal_connect(*member, "close",
  ------------------
  |  |  491|   151k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
 1147|   151k|					G_CALLBACK(vips_object_arg_close),
 1148|   151k|					argument_instance);
 1149|   151k|		}
 1150|   296k|	}
 1151|   779k|}
vips_value_is_null:
 1159|  3.10M|{
 1160|  3.10M|	if (G_IS_PARAM_SPEC_STRING(pspec) &&
  ------------------
  |  |  370|  6.21M|#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
  |  |  ------------------
  |  |  |  |  497|  3.10M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  3.10M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  3.10M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  3.10M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  3.10M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 3.10M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  3.10M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  3.10M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 3.10M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 2.53M, False: 575k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  3.10M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  2.53M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  2.53M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  3.10M|  else \
  |  |  |  |  |  | 2321|  3.10M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  3.10M|  __r; \
  |  |  |  |  |  | 2323|  3.10M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (370:44): [True: 2.53M, False: 575k]
  |  |  ------------------
  ------------------
 1161|  3.10M|		!g_value_get_string(value))
  ------------------
  |  Branch (1161:3): [True: 2.53M, False: 0]
  ------------------
 1162|  2.53M|		return TRUE;
  ------------------
  |  |  798|  2.53M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  2.53M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1163|   575k|	if (G_IS_PARAM_SPEC_OBJECT(pspec) &&
  ------------------
  |  |  491|  1.15M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|   575k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   575k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   575k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   575k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   575k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 575k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   575k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   575k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 575k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 441k, False: 134k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   575k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   441k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   441k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   575k|  else \
  |  |  |  |  |  | 2321|   575k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   575k|  __r; \
  |  |  |  |  |  | 2323|   575k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 441k, False: 134k]
  |  |  ------------------
  ------------------
 1164|   575k|		!g_value_get_object(value))
  ------------------
  |  Branch (1164:3): [True: 441k, False: 0]
  ------------------
 1165|   441k|		return TRUE;
  ------------------
  |  |  798|   441k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   441k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1166|   134k|	if (G_IS_PARAM_SPEC_POINTER(pspec) &&
  ------------------
  |  |  439|   268k|#define G_IS_PARAM_SPEC_POINTER(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
  |  |  ------------------
  |  |  |  |  497|   134k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   134k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   134k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   134k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   134k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 134k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   134k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   134k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 134k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 134k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   134k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   134k|  else \
  |  |  |  |  |  | 2321|   134k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   134k|  __r; \
  |  |  |  |  |  | 2323|   134k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (439:44): [True: 0, False: 134k]
  |  |  ------------------
  ------------------
 1167|   134k|		!g_value_get_pointer(value))
  ------------------
  |  Branch (1167:3): [True: 0, False: 0]
  ------------------
 1168|      0|		return TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1169|   134k|	if (G_IS_PARAM_SPEC_BOXED(pspec) &&
  ------------------
  |  |  416|   268k|#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
  |  |  ------------------
  |  |  |  |  497|   134k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   134k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   134k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   134k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   134k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 134k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   134k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   134k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 134k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 134k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   134k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   134k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   134k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   134k|  else \
  |  |  |  |  |  | 2321|   134k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   134k|  __r; \
  |  |  |  |  |  | 2323|   134k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (416:44): [True: 134k, False: 0]
  |  |  ------------------
  ------------------
 1170|   134k|		!g_value_get_boxed(value))
  ------------------
  |  Branch (1170:3): [True: 134k, False: 0]
  ------------------
 1171|   134k|		return TRUE;
  ------------------
  |  |  798|   134k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   134k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1172|       |
 1173|      0|	return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
 1174|   134k|}
vips_object_set_property:
 1181|  5.46M|{
 1182|  5.46M|	VipsObject *object = VIPS_OBJECT(gobject);
  ------------------
  |  |  433|  5.46M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  5.46M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  5.46M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1183|  5.46M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(gobject);
  ------------------
  |  |  441|  5.46M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  5.46M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  5.46M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1184|  5.46M|	VipsArgumentClass *argument_class = (VipsArgumentClass *)
 1185|  5.46M|		vips__argument_table_lookup(class->argument_table, pspec);
 1186|  5.46M|	VipsArgumentInstance *argument_instance =
 1187|  5.46M|		vips__argument_get_instance(argument_class, object);
 1188|       |
 1189|  5.46M|	g_assert(argument_instance);
  ------------------
  |  |  166|  5.46M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.46M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.46M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1190|       |
 1191|       |#ifdef DEBUG
 1192|       |	printf("vips_object_set_property: ");
 1193|       |	vips_object_print_name(object);
 1194|       |	printf(".%s\n", g_param_spec_get_name(pspec));
 1195|       |
 1196|       |	/* This can crash horribly with some values, have it as a separate
 1197|       |	 * chunk so we can easily comment it out.
 1198|       |	 */
 1199|       |	{
 1200|       |		char *str_value;
 1201|       |
 1202|       |		str_value = g_strdup_value_contents(value);
 1203|       |		printf("\t%s\n", str_value);
 1204|       |		g_free(str_value);
 1205|       |	}
 1206|       |#endif /*DEBUG*/
 1207|       |
 1208|  5.46M|	g_assert(((VipsArgument *) argument_class)->pspec == pspec);
  ------------------
  |  |  166|  5.46M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.46M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.46M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1209|  5.46M|	g_assert(((VipsArgument *) argument_instance)->pspec == pspec);
  ------------------
  |  |  166|  5.46M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.46M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.46M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1210|       |
 1211|       |	/* If this is a construct-only argument, we can only set before we've
 1212|       |	 * built.
 1213|       |	 */
 1214|  5.46M|	if (argument_class->flags & VIPS_ARGUMENT_CONSTRUCT &&
  ------------------
  |  Branch (1214:6): [True: 2.05M, False: 3.41M]
  ------------------
 1215|  5.46M|		object->constructed &&
  ------------------
  |  Branch (1215:3): [True: 1.06M, False: 988k]
  ------------------
 1216|  5.46M|		!vips_value_is_null(pspec, value)) {
  ------------------
  |  Branch (1216:3): [True: 0, False: 1.06M]
  ------------------
 1217|      0|		g_warning("%s: %s can't assign '%s' after construct",
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1218|      0|			G_STRLOC,
 1219|      0|			G_OBJECT_TYPE_NAME(gobject),
 1220|      0|			g_param_spec_get_name(pspec));
 1221|      0|		return;
 1222|      0|	}
 1223|       |
 1224|       |	/* If this is a set-once argument, check we've not set it before.
 1225|       |	 */
 1226|  5.46M|	if (argument_class->flags & VIPS_ARGUMENT_SET_ONCE &&
  ------------------
  |  Branch (1226:6): [True: 4.10M, False: 1.36M]
  ------------------
 1227|  5.46M|		argument_instance->assigned &&
  ------------------
  |  Branch (1227:3): [True: 2.04M, False: 2.06M]
  ------------------
 1228|  5.46M|		!vips_value_is_null(pspec, value)) {
  ------------------
  |  Branch (1228:3): [True: 0, False: 2.04M]
  ------------------
 1229|      0|		g_warning("%s: %s can only assign '%s' once",
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1230|      0|			G_STRLOC,
 1231|      0|			G_OBJECT_TYPE_NAME(gobject),
 1232|      0|			g_param_spec_get_name(pspec));
 1233|      0|		return;
 1234|      0|	}
 1235|       |
 1236|       |	/* We can't use a switch since some param specs don't have fundamental
 1237|       |	 * types and are hence not compile-time constants, argh.
 1238|       |	 */
 1239|  5.46M|	if (G_IS_PARAM_SPEC_STRING(pspec)) {
  ------------------
  |  |  370|  5.46M|#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
  |  |  ------------------
  |  |  |  |  497|  5.46M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  5.46M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  5.46M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  5.46M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  5.46M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 5.46M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  5.46M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  5.46M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 5.46M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 4.21M, False: 1.24M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  5.46M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  4.21M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  4.21M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  5.46M|  else \
  |  |  |  |  |  | 2321|  5.46M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  5.46M|  __r; \
  |  |  |  |  |  | 2323|  5.46M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (370:44): [True: 4.21M, False: 1.24M]
  |  |  ------------------
  ------------------
 1240|  4.21M|		char **member = &G_STRUCT_MEMBER(char *, object,
  ------------------
  |  |  842|  4.21M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  4.21M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1241|  4.21M|			argument_class->offset);
 1242|       |
 1243|  4.21M|		if (*member)
  ------------------
  |  Branch (1243:7): [True: 2.21M, False: 2.00M]
  ------------------
 1244|  2.21M|			g_free(*member);
 1245|  4.21M|		*member = g_value_dup_string(value);
 1246|  4.21M|	}
 1247|  1.24M|	else if (G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|  1.24M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  1.24M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.24M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.24M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.24M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.24M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.24M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.24M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.24M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.24M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 779k, False: 469k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.24M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   779k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   779k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.24M|  else \
  |  |  |  |  |  | 2321|  1.24M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.24M|  __r; \
  |  |  |  |  |  | 2323|  1.24M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 779k, False: 469k]
  |  |  ------------------
  ------------------
 1248|   779k|		GObject **member = &G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|   779k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   779k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1249|   779k|			argument_class->offset);
 1250|       |
 1251|   779k|		vips__object_set_member(object, pspec, member,
 1252|   779k|			g_value_get_object(value));
 1253|   779k|	}
 1254|   469k|	else if (G_IS_PARAM_SPEC_INT(pspec)) {
  ------------------
  |  |  117|   469k|#define G_IS_PARAM_SPEC_INT(pspec)         (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT))
  |  |  ------------------
  |  |  |  |  497|   469k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   469k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   469k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   469k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   469k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 469k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   469k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   469k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 469k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 100k, False: 369k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   469k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   100k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   100k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   469k|  else \
  |  |  |  |  |  | 2321|   469k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   469k|  __r; \
  |  |  |  |  |  | 2323|   469k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (117:44): [True: 100k, False: 369k]
  |  |  ------------------
  ------------------
 1255|   100k|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|   100k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   100k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1256|   100k|			argument_class->offset);
 1257|       |
 1258|   100k|		*member = g_value_get_int(value);
 1259|   100k|	}
 1260|   369k|	else if (G_IS_PARAM_SPEC_UINT64(pspec)) {
  ------------------
  |  |  232|   369k|#define G_IS_PARAM_SPEC_UINT64(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT64))
  |  |  ------------------
  |  |  |  |  497|   369k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   369k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   369k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   369k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   369k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 369k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   369k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   369k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 369k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 369k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   369k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   369k|  else \
  |  |  |  |  |  | 2321|   369k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   369k|  __r; \
  |  |  |  |  |  | 2323|   369k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (232:44): [True: 0, False: 369k]
  |  |  ------------------
  ------------------
 1261|      0|		guint64 *member = &G_STRUCT_MEMBER(guint64, object,
  ------------------
  |  |  842|      0|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|      0|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1262|      0|			argument_class->offset);
 1263|       |
 1264|      0|		*member = g_value_get_uint64(value);
 1265|      0|	}
 1266|   369k|	else if (G_IS_PARAM_SPEC_BOOLEAN(pspec)) {
  ------------------
  |  |   94|   369k|#define G_IS_PARAM_SPEC_BOOLEAN(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
  |  |  ------------------
  |  |  |  |  497|   369k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   369k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   369k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   369k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   369k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 369k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   369k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   369k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 369k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 12.6k, False: 356k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   369k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  12.6k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  12.6k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   369k|  else \
  |  |  |  |  |  | 2321|   369k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   369k|  __r; \
  |  |  |  |  |  | 2323|   369k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (94:44): [True: 12.6k, False: 356k]
  |  |  ------------------
  ------------------
 1267|  12.6k|		gboolean *member = &G_STRUCT_MEMBER(gboolean, object,
  ------------------
  |  |  842|  12.6k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  12.6k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1268|  12.6k|			argument_class->offset);
 1269|       |
 1270|  12.6k|		*member = g_value_get_boolean(value);
 1271|  12.6k|	}
 1272|   356k|	else if (G_IS_PARAM_SPEC_ENUM(pspec)) {
  ------------------
  |  |  278|   356k|#define G_IS_PARAM_SPEC_ENUM(pspec)        (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM))
  |  |  ------------------
  |  |  |  |  497|   356k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   356k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   356k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   356k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   356k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 356k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   356k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   356k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 356k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 53.0k, False: 303k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   356k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  53.0k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  53.0k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   356k|  else \
  |  |  |  |  |  | 2321|   356k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   356k|  __r; \
  |  |  |  |  |  | 2323|   356k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (278:44): [True: 53.0k, False: 303k]
  |  |  ------------------
  ------------------
 1273|  53.0k|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|  53.0k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  53.0k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1274|  53.0k|			argument_class->offset);
 1275|       |
 1276|  53.0k|		*member = g_value_get_enum(value);
 1277|  53.0k|	}
 1278|   303k|	else if (G_IS_PARAM_SPEC_FLAGS(pspec)) {
  ------------------
  |  |  301|   303k|#define G_IS_PARAM_SPEC_FLAGS(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLAGS))
  |  |  ------------------
  |  |  |  |  497|   303k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   303k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   303k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   303k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   303k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 303k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   303k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   303k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 303k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 14.1k, False: 289k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   303k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  14.1k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  14.1k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   303k|  else \
  |  |  |  |  |  | 2321|   303k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   303k|  __r; \
  |  |  |  |  |  | 2323|   303k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (301:44): [True: 14.1k, False: 289k]
  |  |  ------------------
  ------------------
 1279|  14.1k|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|  14.1k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  14.1k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1280|  14.1k|			argument_class->offset);
 1281|       |
 1282|  14.1k|		*member = g_value_get_flags(value);
 1283|  14.1k|	}
 1284|   289k|	else if (G_IS_PARAM_SPEC_POINTER(pspec)) {
  ------------------
  |  |  439|   289k|#define G_IS_PARAM_SPEC_POINTER(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
  |  |  ------------------
  |  |  |  |  497|   289k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   289k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   289k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   289k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   289k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 289k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   289k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   289k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 289k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 289k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   289k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   289k|  else \
  |  |  |  |  |  | 2321|   289k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   289k|  __r; \
  |  |  |  |  |  | 2323|   289k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (439:44): [True: 0, False: 289k]
  |  |  ------------------
  ------------------
 1285|      0|		gpointer *member = &G_STRUCT_MEMBER(gpointer, object,
  ------------------
  |  |  842|      0|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|      0|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1286|      0|			argument_class->offset);
 1287|       |
 1288|      0|		*member = g_value_get_pointer(value);
 1289|      0|	}
 1290|   289k|	else if (G_IS_PARAM_SPEC_DOUBLE(pspec)) {
  ------------------
  |  |  347|   289k|#define G_IS_PARAM_SPEC_DOUBLE(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_DOUBLE))
  |  |  ------------------
  |  |  |  |  497|   289k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   289k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   289k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   289k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   289k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 289k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   289k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   289k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 289k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 289k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   289k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   289k|  else \
  |  |  |  |  |  | 2321|   289k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   289k|  __r; \
  |  |  |  |  |  | 2323|   289k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (347:44): [True: 0, False: 289k]
  |  |  ------------------
  ------------------
 1291|      0|		double *member = &G_STRUCT_MEMBER(double, object,
  ------------------
  |  |  842|      0|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|      0|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1292|      0|			argument_class->offset);
 1293|       |
 1294|      0|		*member = g_value_get_double(value);
 1295|      0|	}
 1296|   289k|	else if (G_IS_PARAM_SPEC_BOXED(pspec)) {
  ------------------
  |  |  416|   289k|#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
  |  |  ------------------
  |  |  |  |  497|   289k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   289k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   289k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   289k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   289k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 289k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   289k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   289k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 289k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 289k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   289k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   289k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   289k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   289k|  else \
  |  |  |  |  |  | 2321|   289k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   289k|  __r; \
  |  |  |  |  |  | 2323|   289k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (416:44): [True: 289k, False: 0]
  |  |  ------------------
  ------------------
 1297|   289k|		gpointer *member = &G_STRUCT_MEMBER(gpointer, object,
  ------------------
  |  |  842|   289k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   289k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1298|   289k|			argument_class->offset);
 1299|       |
 1300|   289k|		if (*member) {
  ------------------
  |  Branch (1300:7): [True: 155k, False: 133k]
  ------------------
 1301|   155k|			g_boxed_free(G_PARAM_SPEC_VALUE_TYPE(pspec),
  ------------------
  |  |  103|   155k|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|   155k|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|   155k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|   155k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1302|   155k|				*member);
 1303|   155k|			*member = NULL;
 1304|   155k|		}
 1305|       |
 1306|       |		/* Copy the boxed into our pointer (will use eg.
 1307|       |		 * vips__object_vector_dup()).
 1308|       |		 */
 1309|   289k|		*member = g_value_dup_boxed(value);
 1310|   289k|	}
 1311|      0|	else {
 1312|      0|		g_warning("%s: %s.%s unimplemented property type %s",
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1313|      0|			G_STRLOC,
 1314|      0|			G_OBJECT_TYPE_NAME(gobject),
 1315|      0|			g_param_spec_get_name(pspec),
 1316|      0|			g_type_name(G_PARAM_SPEC_VALUE_TYPE(pspec)));
 1317|      0|	}
 1318|       |
 1319|       |	/* Note that it's now been set.
 1320|       |	 */
 1321|  5.46M|	argument_instance->assigned = TRUE;
  ------------------
  |  |  798|  5.46M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  5.46M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1322|  5.46M|}
vips_object_get_property:
 1329|  1.04M|{
 1330|  1.04M|	VipsObject *object = VIPS_OBJECT(gobject);
  ------------------
  |  |  433|  1.04M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  1.04M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.04M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1331|  1.04M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(gobject);
  ------------------
  |  |  441|  1.04M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  1.04M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  1.04M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1332|  1.04M|	VipsArgumentClass *argument_class = (VipsArgumentClass *)
 1333|  1.04M|		vips__argument_table_lookup(class->argument_table, pspec);
 1334|  1.04M|	VipsArgumentInstance *argument_instance =
 1335|  1.04M|		vips__argument_get_instance(argument_class, object);
 1336|       |
 1337|  1.04M|	g_assert(((VipsArgument *) argument_class)->pspec == pspec);
  ------------------
  |  |  166|  1.04M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.04M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.04M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1338|       |
 1339|  1.04M|	if (!argument_instance->assigned) {
  ------------------
  |  Branch (1339:6): [True: 0, False: 1.04M]
  ------------------
 1340|       |		/* Set the value to the default. Things like Ruby
 1341|       |		 * gobject-introspection will walk objects during GC, and we
 1342|       |		 * can find ourselves fetching object values between init and
 1343|       |		 * build.
 1344|       |		 */
 1345|      0|		g_param_value_set_default(pspec, value);
 1346|      0|		return;
 1347|      0|	}
 1348|       |
 1349|  1.04M|	if (G_IS_PARAM_SPEC_STRING(pspec)) {
  ------------------
  |  |  370|  1.04M|#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
  |  |  ------------------
  |  |  |  |  497|  1.04M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.04M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.04M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.04M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.04M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.04M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.04M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.04M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.04M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 2.79k, False: 1.04M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.04M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  2.79k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  2.79k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.04M|  else \
  |  |  |  |  |  | 2321|  1.04M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.04M|  __r; \
  |  |  |  |  |  | 2323|  1.04M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (370:44): [True: 2.79k, False: 1.04M]
  |  |  ------------------
  ------------------
 1350|  2.79k|		char *member = G_STRUCT_MEMBER(char *, object,
  ------------------
  |  |  842|  2.79k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  2.79k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1351|  2.79k|			argument_class->offset);
 1352|       |
 1353|  2.79k|		g_value_set_string(value, member);
 1354|  2.79k|	}
 1355|  1.04M|	else if (G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|  1.04M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  1.04M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.04M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.04M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.04M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.04M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.04M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.04M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.04M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.04M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 727k, False: 319k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.04M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   727k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   727k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.04M|  else \
  |  |  |  |  |  | 2321|  1.04M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.04M|  __r; \
  |  |  |  |  |  | 2323|  1.04M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 727k, False: 319k]
  |  |  ------------------
  ------------------
 1356|   727k|		GObject **member = &G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|   727k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   727k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1357|   727k|			argument_class->offset);
 1358|       |
 1359|   727k|		g_value_set_object(value, *member);
 1360|   727k|	}
 1361|   319k|	else if (G_IS_PARAM_SPEC_INT(pspec)) {
  ------------------
  |  |  117|   319k|#define G_IS_PARAM_SPEC_INT(pspec)         (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT))
  |  |  ------------------
  |  |  |  |  497|   319k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   319k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   319k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   319k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   319k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 319k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   319k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   319k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 319k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 154k, False: 164k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   319k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   154k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   154k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   319k|  else \
  |  |  |  |  |  | 2321|   319k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   319k|  __r; \
  |  |  |  |  |  | 2323|   319k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (117:44): [True: 154k, False: 164k]
  |  |  ------------------
  ------------------
 1362|   154k|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|   154k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   154k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1363|   154k|			argument_class->offset);
 1364|       |
 1365|   154k|		g_value_set_int(value, *member);
 1366|   154k|	}
 1367|   164k|	else if (G_IS_PARAM_SPEC_UINT64(pspec)) {
  ------------------
  |  |  232|   164k|#define G_IS_PARAM_SPEC_UINT64(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT64))
  |  |  ------------------
  |  |  |  |  497|   164k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   164k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   164k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   164k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   164k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 164k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   164k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   164k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 164k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 164k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   164k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   164k|  else \
  |  |  |  |  |  | 2321|   164k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   164k|  __r; \
  |  |  |  |  |  | 2323|   164k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (232:44): [True: 0, False: 164k]
  |  |  ------------------
  ------------------
 1368|      0|		guint64 *member = &G_STRUCT_MEMBER(guint64, object,
  ------------------
  |  |  842|      0|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|      0|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1369|      0|			argument_class->offset);
 1370|       |
 1371|      0|		g_value_set_uint64(value, *member);
 1372|      0|	}
 1373|   164k|	else if (G_IS_PARAM_SPEC_BOOLEAN(pspec)) {
  ------------------
  |  |   94|   164k|#define G_IS_PARAM_SPEC_BOOLEAN(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
  |  |  ------------------
  |  |  |  |  497|   164k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   164k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   164k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   164k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   164k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 164k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   164k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   164k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 164k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 3.38k, False: 161k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   164k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  3.38k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  3.38k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   164k|  else \
  |  |  |  |  |  | 2321|   164k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   164k|  __r; \
  |  |  |  |  |  | 2323|   164k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (94:44): [True: 3.38k, False: 161k]
  |  |  ------------------
  ------------------
 1374|  3.38k|		gboolean *member = &G_STRUCT_MEMBER(gboolean, object,
  ------------------
  |  |  842|  3.38k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  3.38k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1375|  3.38k|			argument_class->offset);
 1376|       |
 1377|  3.38k|		g_value_set_boolean(value, *member);
 1378|  3.38k|	}
 1379|   161k|	else if (G_IS_PARAM_SPEC_ENUM(pspec)) {
  ------------------
  |  |  278|   161k|#define G_IS_PARAM_SPEC_ENUM(pspec)        (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM))
  |  |  ------------------
  |  |  |  |  497|   161k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   161k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   161k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   161k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   161k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 161k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   161k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   161k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 161k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 71.9k, False: 89.2k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   161k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  71.9k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  71.9k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   161k|  else \
  |  |  |  |  |  | 2321|   161k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   161k|  __r; \
  |  |  |  |  |  | 2323|   161k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (278:44): [True: 71.9k, False: 89.2k]
  |  |  ------------------
  ------------------
 1380|  71.9k|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|  71.9k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  71.9k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1381|  71.9k|			argument_class->offset);
 1382|       |
 1383|  71.9k|		g_value_set_enum(value, *member);
 1384|  71.9k|	}
 1385|  89.2k|	else if (G_IS_PARAM_SPEC_FLAGS(pspec)) {
  ------------------
  |  |  301|  89.2k|#define G_IS_PARAM_SPEC_FLAGS(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLAGS))
  |  |  ------------------
  |  |  |  |  497|  89.2k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  89.2k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  89.2k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  89.2k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  89.2k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 89.2k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  89.2k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  89.2k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 89.2k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 89.2k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  89.2k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  89.2k|  else \
  |  |  |  |  |  | 2321|  89.2k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  89.2k|  __r; \
  |  |  |  |  |  | 2323|  89.2k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (301:44): [True: 0, False: 89.2k]
  |  |  ------------------
  ------------------
 1386|      0|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|      0|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|      0|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1387|      0|			argument_class->offset);
 1388|       |
 1389|      0|		g_value_set_flags(value, *member);
 1390|      0|	}
 1391|  89.2k|	else if (G_IS_PARAM_SPEC_POINTER(pspec)) {
  ------------------
  |  |  439|  89.2k|#define G_IS_PARAM_SPEC_POINTER(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
  |  |  ------------------
  |  |  |  |  497|  89.2k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  89.2k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  89.2k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  89.2k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  89.2k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 89.2k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  89.2k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  89.2k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 89.2k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 89.2k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  89.2k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  89.2k|  else \
  |  |  |  |  |  | 2321|  89.2k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  89.2k|  __r; \
  |  |  |  |  |  | 2323|  89.2k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (439:44): [True: 0, False: 89.2k]
  |  |  ------------------
  ------------------
 1392|      0|		gpointer *member = &G_STRUCT_MEMBER(gpointer, object,
  ------------------
  |  |  842|      0|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|      0|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1393|      0|			argument_class->offset);
 1394|       |
 1395|      0|		g_value_set_pointer(value, *member);
 1396|      0|	}
 1397|  89.2k|	else if (G_IS_PARAM_SPEC_DOUBLE(pspec)) {
  ------------------
  |  |  347|  89.2k|#define G_IS_PARAM_SPEC_DOUBLE(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_DOUBLE))
  |  |  ------------------
  |  |  |  |  497|  89.2k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  89.2k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  89.2k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  89.2k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  89.2k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 89.2k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  89.2k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  89.2k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 89.2k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 89.2k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  89.2k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  89.2k|  else \
  |  |  |  |  |  | 2321|  89.2k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  89.2k|  __r; \
  |  |  |  |  |  | 2323|  89.2k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (347:44): [True: 0, False: 89.2k]
  |  |  ------------------
  ------------------
 1398|      0|		double *member = &G_STRUCT_MEMBER(double, object,
  ------------------
  |  |  842|      0|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|      0|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1399|      0|			argument_class->offset);
 1400|       |
 1401|      0|		g_value_set_double(value, *member);
 1402|      0|	}
 1403|  89.2k|	else if (G_IS_PARAM_SPEC_BOXED(pspec)) {
  ------------------
  |  |  416|  89.2k|#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
  |  |  ------------------
  |  |  |  |  497|  89.2k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  89.2k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  89.2k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  89.2k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  89.2k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 89.2k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  89.2k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  89.2k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 89.2k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 89.2k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  89.2k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  89.2k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  89.2k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  89.2k|  else \
  |  |  |  |  |  | 2321|  89.2k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  89.2k|  __r; \
  |  |  |  |  |  | 2323|  89.2k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (416:44): [True: 89.2k, False: 0]
  |  |  ------------------
  ------------------
 1404|  89.2k|		gpointer *member = &G_STRUCT_MEMBER(gpointer, object,
  ------------------
  |  |  842|  89.2k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  89.2k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1405|  89.2k|			argument_class->offset);
 1406|       |
 1407|       |		/* Copy the boxed into our pointer (will use eg.
 1408|       |		 * vips__object_vector_dup ()).
 1409|       |		 */
 1410|  89.2k|		g_value_set_boxed(value, *member);
 1411|  89.2k|	}
 1412|      0|	else {
 1413|      0|		g_warning("%s: %s.%s unimplemented property type %s",
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1414|      0|			G_STRLOC,
 1415|      0|			G_OBJECT_TYPE_NAME(gobject),
 1416|      0|			g_param_spec_get_name(pspec),
 1417|      0|			g_type_name(G_PARAM_SPEC_VALUE_TYPE(pspec)));
 1418|      0|	}
 1419|  1.04M|}
vips_object_class_install_argument:
 1712|    864|{
 1713|    864|	VipsArgumentClass *argument_class = g_new(VipsArgumentClass, 1);
  ------------------
  |  |  282|    864|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|    864|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|    864|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|    864|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|    864|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|    864|	  gpointer __p;						\
  |  |  |  |  231|    864|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 864]
  |  |  |  |  ------------------
  |  |  |  |  232|    864|	    __p = g_##func (__n);				\
  |  |  |  |  233|    864|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 864, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|    864|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 864]
  |  |  |  |  |  Branch (234:26): [True: 864, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|    864|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|    864|	  else							\
  |  |  |  |  237|    864|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|    864|	  __p;							\
  |  |  |  |  239|    864|	}))
  |  |  ------------------
  ------------------
 1714|       |
 1715|    864|	GSList *argument_table_traverse;
 1716|    864|	VipsArgumentClass *ac;
 1717|       |
 1718|       |#ifdef DEBUG
 1719|       |	printf("vips_object_class_install_argument: %p %s %s\n",
 1720|       |		object_class,
 1721|       |		g_type_name(G_TYPE_FROM_CLASS(object_class)),
 1722|       |		g_param_spec_get_name(pspec));
 1723|       |#endif /*DEBUG*/
 1724|       |
 1725|       |	/* object_class->argument* is shared, so we must lock.
 1726|       |	 */
 1727|    864|	g_mutex_lock(&vips__global_lock);
 1728|       |
 1729|       |	/* Must be a new one.
 1730|       |	 */
 1731|    864|	g_assert(!g_hash_table_lookup(object_class->argument_table, pspec));
  ------------------
  |  |  166|    864|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    864|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    864|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1732|       |
 1733|       |	/* Mustn't have INPUT and OUTPUT both set.
 1734|       |	 */
 1735|    864|	g_assert(!(
  ------------------
  |  |  166|    864|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    864|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    864|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1736|    864|		(flags & VIPS_ARGUMENT_INPUT) &&
 1737|    864|		(flags & VIPS_ARGUMENT_OUTPUT)));
 1738|       |
 1739|    864|	((VipsArgument *) argument_class)->pspec = pspec;
 1740|    864|	argument_class->object_class = object_class;
 1741|    864|	argument_class->flags = flags;
 1742|    864|	argument_class->priority = priority;
 1743|    864|	argument_class->offset = offset;
 1744|       |
 1745|    864|	vips_argument_table_replace(object_class->argument_table,
 1746|    864|		(VipsArgument *) argument_class);
 1747|       |
 1748|       |	/* If this is the first argument for a new subclass, we need to clone
 1749|       |	 * the traverse list we inherit.
 1750|       |	 */
 1751|    864|	if (object_class->argument_table_traverse_gtype !=
  ------------------
  |  Branch (1751:6): [True: 289, False: 575]
  ------------------
 1752|    864|		G_TYPE_FROM_CLASS(object_class)) {
  ------------------
  |  |  613|    864|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
 1753|       |#ifdef DEBUG
 1754|       |		printf("vips_object_class_install_argument: cloning traverse\n");
 1755|       |#endif /*DEBUG*/
 1756|       |
 1757|    289|		object_class->argument_table_traverse =
 1758|    289|			g_slist_copy(object_class->argument_table_traverse);
 1759|    289|		object_class->argument_table_traverse_gtype =
 1760|    289|			G_TYPE_FROM_CLASS(object_class);
  ------------------
  |  |  613|    289|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
 1761|    289|	}
 1762|       |
 1763|       |	/* We read argument_table_traverse without a lock (eg. see
 1764|       |	 * vips_argument_map()), so we must be very careful updating it.
 1765|       |	 */
 1766|    864|	argument_table_traverse =
 1767|    864|		g_slist_copy(object_class->argument_table_traverse);
 1768|       |
 1769|       |	/* We keep traverse sorted by priority, so we mustn't have duplicate
 1770|       |	 * priority values in required args.
 1771|       |	 */
 1772|    864|	if ((flags & VIPS_ARGUMENT_REQUIRED) &&
  ------------------
  |  Branch (1772:6): [True: 436, False: 428]
  ------------------
 1773|    864|		!(flags & VIPS_ARGUMENT_DEPRECATED) &&
  ------------------
  |  Branch (1773:3): [True: 428, False: 8]
  ------------------
 1774|    864|		(ac = vips_slist_map2(argument_table_traverse,
  ------------------
  |  Branch (1774:3): [True: 0, False: 428]
  ------------------
 1775|    428|			 traverse_find_required_priority,
 1776|    428|			 GINT_TO_POINTER(priority), NULL)))
 1777|      0|		g_warning("vips_object_class_install_argument: "
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1778|    864|				  "%s.%s, %s.%s duplicate priority",
 1779|    864|			g_type_name(G_TYPE_FROM_CLASS(object_class)),
 1780|    864|			g_param_spec_get_name(pspec),
 1781|    864|			g_type_name(G_TYPE_FROM_CLASS(ac->object_class)),
 1782|    864|			g_param_spec_get_name(((VipsArgument *) ac)->pspec));
 1783|       |
 1784|       |	/* Warn about optional boolean args which default TRUE. These won't
 1785|       |	 * work from the CLI, since simple GOption switches don't allow
 1786|       |	 * `=false`.
 1787|       |	 */
 1788|    864|	if (!(flags & VIPS_ARGUMENT_REQUIRED) &&
  ------------------
  |  Branch (1788:6): [True: 428, False: 436]
  ------------------
 1789|    864|		!(flags & VIPS_ARGUMENT_DEPRECATED) &&
  ------------------
  |  Branch (1789:3): [True: 399, False: 29]
  ------------------
 1790|    864|		G_IS_PARAM_SPEC_BOOLEAN(pspec) &&
  ------------------
  |  |   94|  1.26k|#define G_IS_PARAM_SPEC_BOOLEAN(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
  |  |  ------------------
  |  |  |  |  497|    399|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|    399|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|    399|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|    399|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|    399|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 399]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|    399|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|    399|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 399, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 72, False: 327]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|    399|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|     72|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|     72|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|    399|  else \
  |  |  |  |  |  | 2321|    399|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|    399|  __r; \
  |  |  |  |  |  | 2323|    399|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (94:44): [True: 72, False: 327]
  |  |  ------------------
  ------------------
 1791|    864|		G_PARAM_SPEC_BOOLEAN(pspec)->default_value)
  ------------------
  |  |  101|     72|#define G_PARAM_SPEC_BOOLEAN(pspec)        (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOOLEAN, GParamSpecBoolean))
  |  |  ------------------
  |  |  |  |  484|     72|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     72|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1791:3): [True: 0, False: 72]
  ------------------
 1792|      0|		g_warning("vips_object_class_install_argument: "
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
 1793|    864|				  "default TRUE BOOL arg %s.%s",
 1794|    864|			g_type_name(G_TYPE_FROM_CLASS(object_class)),
 1795|    864|			g_param_spec_get_name(pspec));
 1796|       |
 1797|    864|	argument_table_traverse = g_slist_prepend(
 1798|    864|		argument_table_traverse, argument_class);
 1799|    864|	argument_table_traverse = g_slist_sort(
 1800|    864|		argument_table_traverse, (GCompareFunc) traverse_sort);
 1801|    864|	VIPS_SWAP(GSList *,
  ------------------
  |  |  114|    864|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    864|#define G_STMT_START  do
  |  |  ------------------
  |  |  115|    864|	{ \
  |  |  116|    864|		TYPE t = (A); \
  |  |  117|    864|		(A) = (B); \
  |  |  118|    864|		(B) = t; \
  |  |  119|    864|	} \
  |  |  120|    864|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    864|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1802|    864|		argument_table_traverse,
 1803|    864|		object_class->argument_table_traverse);
 1804|       |
 1805|    864|	g_slist_free(argument_table_traverse);
 1806|       |
 1807|       |#ifdef DEBUG
 1808|       |	{
 1809|       |		GSList *p;
 1810|       |
 1811|       |		printf("%d items on traverse %p\n",
 1812|       |			g_slist_length(object_class->argument_table_traverse),
 1813|       |			&object_class->argument_table_traverse);
 1814|       |		for (p = object_class->argument_table_traverse; p; p = p->next) {
 1815|       |			VipsArgumentClass *argument_class =
 1816|       |				(VipsArgumentClass *) p->data;
 1817|       |
 1818|       |			printf("\t%p %s\n",
 1819|       |				argument_class,
 1820|       |				g_param_spec_get_name(
 1821|       |					((VipsArgument *) argument_class)->pspec));
 1822|       |		}
 1823|       |	}
 1824|       |#endif /*DEBUG*/
 1825|       |
 1826|    864|	g_mutex_unlock(&vips__global_lock);
 1827|    864|}
vips_object_new:
 2361|  28.4k|{
 2362|  28.4k|	VipsObject *object;
 2363|       |
 2364|  28.4k|	vips_check_init();
 2365|       |
 2366|  28.4k|	object = VIPS_OBJECT(g_object_new(type, NULL));
  ------------------
  |  |  433|  28.4k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  28.4k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  28.4k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2367|       |
 2368|  28.4k|	if (set && set(object, a, b)) {
  ------------------
  |  Branch (2368:6): [True: 28.4k, False: 0]
  |  Branch (2368:13): [True: 0, False: 28.4k]
  ------------------
 2369|      0|		g_object_unref(object);
 2370|      0|		return NULL;
 2371|      0|	}
 2372|       |
 2373|  28.4k|	if (vips_object_build(object)) {
  ------------------
  |  Branch (2373:6): [True: 0, False: 28.4k]
  ------------------
 2374|      0|		g_object_unref(object);
 2375|      0|		return NULL;
 2376|      0|	}
 2377|       |
 2378|  28.4k|	return object;
 2379|  28.4k|}
vips_object_set_valist:
 2392|   171k|{
 2393|   171k|	char *name;
 2394|       |
 2395|   171k|	VIPS_DEBUG_MSG("vips_object_set_valist:\n");
  ------------------
  |  |   47|   171k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   171k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   171k|	{ \
  |  |   49|   171k|		; \
  |  |   50|   171k|	} \
  |  |   51|   171k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   171k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2396|       |
 2397|   209k|	for (name = va_arg(ap, char *); name; name = va_arg(ap, char *)) {
  ------------------
  |  Branch (2397:34): [True: 37.7k, False: 171k]
  ------------------
 2398|  37.7k|		GParamSpec *pspec;
 2399|  37.7k|		VipsArgumentClass *argument_class;
 2400|  37.7k|		VipsArgumentInstance *argument_instance;
 2401|       |
 2402|  37.7k|		VIPS_DEBUG_MSG("\tname = '%s' (%p)\n", name, name);
  ------------------
  |  |   47|  37.7k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  37.7k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  37.7k|	{ \
  |  |   49|  37.7k|		; \
  |  |   50|  37.7k|	} \
  |  |   51|  37.7k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  37.7k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2403|       |
 2404|  37.7k|		if (vips_object_get_argument(VIPS_OBJECT(object), name,
  ------------------
  |  |  433|  37.7k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  37.7k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  37.7k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2404:7): [True: 0, False: 37.7k]
  ------------------
 2405|  37.7k|				&pspec, &argument_class, &argument_instance))
 2406|      0|			return -1;
 2407|       |
 2408|  75.4k|		VIPS_ARGUMENT_COLLECT_SET(pspec, argument_class, ap);
  ------------------
  |  |  399|  37.7k|	if ((ARG_CLASS->flags & VIPS_ARGUMENT_INPUT)) { \
  |  |  ------------------
  |  |  |  Branch (399:6): [True: 37.7k, False: 0]
  |  |  ------------------
  |  |  400|  37.7k|		GValue value = G_VALUE_INIT; \
  |  |  ------------------
  |  |  |  |  191|  37.7k|#define G_VALUE_INIT  { 0, { { 0 } } }
  |  |  ------------------
  |  |  401|  37.7k|		gchar *error = NULL; \
  |  |  402|  37.7k|\
  |  |  403|  37.7k|		/* Input args are given inline, eg. ("factor", 12.0) \
  |  |  404|  37.7k|		 * and must be collected. \
  |  |  405|  37.7k|		 */ \
  |  |  406|  37.7k|		G_VALUE_COLLECT_INIT(&value, \
  |  |  ------------------
  |  |  |  |   88|  37.7k|#define G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error)		\
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  37.7k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   89|  37.7k|G_STMT_START {										\
  |  |  |  |   90|  37.7k|  GValue *g_vci_val = (value);								\
  |  |  |  |   91|  37.7k|  guint g_vci_flags = (flags);								\
  |  |  |  |   92|  37.7k|  GTypeValueTable *g_vci_vtab = g_type_value_table_peek (_value_type);			\
  |  |  |  |   93|  37.7k|  const gchar *g_vci_collect_format = g_vci_vtab->collect_format;					\
  |  |  |  |   94|  37.7k|  GTypeCValue g_vci_cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };		\
  |  |  |  |   95|  37.7k|  guint g_vci_n_values = 0;									\
  |  |  |  |   96|  37.7k|                                                                                        \
  |  |  |  |   97|  37.7k|  g_vci_val->g_type = _value_type;		/* value_meminit() from gvalue.c */		\
  |  |  |  |   98|  75.4k|  while (*g_vci_collect_format)								\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (98:10): [True: 37.7k, False: 37.7k]
  |  |  |  |  ------------------
  |  |  |  |   99|  37.7k|    {											\
  |  |  |  |  100|  37.7k|      GTypeCValue *g_vci_cvalue = g_vci_cvalues + g_vci_n_values++;					\
  |  |  |  |  101|  37.7k|                                                                                        \
  |  |  |  |  102|  37.7k|      switch (*g_vci_collect_format++)							\
  |  |  |  |  103|  37.7k|	{										\
  |  |  |  |  104|  37.1k|	case G_VALUE_COLLECT_INT:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (104:2): [True: 37.1k, False: 528]
  |  |  |  |  ------------------
  |  |  |  |  105|  37.1k|	  g_vci_cvalue->v_int = va_arg ((var_args), gint);					\
  |  |  |  |  106|  37.1k|	  break;									\
  |  |  |  |  107|      0|	case G_VALUE_COLLECT_LONG:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:2): [True: 0, False: 37.7k]
  |  |  |  |  ------------------
  |  |  |  |  108|      0|	  g_vci_cvalue->v_long = va_arg ((var_args), glong);					\
  |  |  |  |  109|      0|	  break;									\
  |  |  |  |  110|      0|	case G_VALUE_COLLECT_INT64:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (110:2): [True: 0, False: 37.7k]
  |  |  |  |  ------------------
  |  |  |  |  111|      0|	  g_vci_cvalue->v_int64 = va_arg ((var_args), gint64);				\
  |  |  |  |  112|      0|	  break;									\
  |  |  |  |  113|      0|	case G_VALUE_COLLECT_DOUBLE:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (113:2): [True: 0, False: 37.7k]
  |  |  |  |  ------------------
  |  |  |  |  114|      0|	  g_vci_cvalue->v_double = va_arg ((var_args), gdouble);				\
  |  |  |  |  115|      0|	  break;									\
  |  |  |  |  116|    528|	case G_VALUE_COLLECT_POINTER:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (116:2): [True: 528, False: 37.1k]
  |  |  |  |  ------------------
  |  |  |  |  117|    528|	  g_vci_cvalue->v_pointer = va_arg ((var_args), gpointer);				\
  |  |  |  |  118|    528|	  break;									\
  |  |  |  |  119|      0|	default:									\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (119:2): [True: 0, False: 37.7k]
  |  |  |  |  ------------------
  |  |  |  |  120|      0|	  g_assert_not_reached ();							\
  |  |  |  |  ------------------
  |  |  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  121|  37.7k|	}										\
  |  |  |  |  122|  37.7k|    }											\
  |  |  |  |  123|  37.7k|  *(__error) = g_vci_vtab->collect_value (g_vci_val,						\
  |  |  |  |  124|  37.7k|				       g_vci_n_values,					\
  |  |  |  |  125|  37.7k|				       g_vci_cvalues,					\
  |  |  |  |  126|  37.7k|				       g_vci_flags);						\
  |  |  |  |  127|  37.7k|} G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  37.7k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  407|  37.7k|			G_PARAM_SPEC_VALUE_TYPE(PSPEC), AP, 0, &error); \
  |  |  408|  37.7k|\
  |  |  409|  37.7k|		/* Don't bother with the error message. \
  |  |  410|  37.7k|		 */ \
  |  |  411|  37.7k|		if (error) { \
  |  |  ------------------
  |  |  |  Branch (411:7): [True: 0, False: 37.7k]
  |  |  ------------------
  |  |  412|      0|			VIPS_DEBUG_MSG("VIPS_OBJECT_COLLECT_SET: err\n"); \
  |  |  ------------------
  |  |  |  |   47|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   48|      0|	{ \
  |  |  |  |   49|      0|		; \
  |  |  |  |   50|      0|	} \
  |  |  |  |   51|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  413|      0|			g_free(error); \
  |  |  414|      0|		}
  ------------------
 2409|       |
 2410|  75.4k|		g_object_set_property(G_OBJECT(object), name, &value);
  ------------------
  |  |   51|  37.7k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  37.7k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  37.7k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2411|       |
 2412|  75.4k|		VIPS_ARGUMENT_COLLECT_GET(pspec, argument_class, ap);
  ------------------
  |  |  417|  37.7k|	g_value_unset(&value); \
  |  |  418|  37.7k|	} \
  |  |  419|  37.7k|	else if ((ARG_CLASS->flags & VIPS_ARGUMENT_OUTPUT)) \
  |  |  ------------------
  |  |  |  Branch (419:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  420|      0|	{ \
  |  |  421|      0|		void **arg G_GNUC_UNUSED; \
  |  |  422|      0|\
  |  |  423|      0|		/* Output args are a pointer to where to send the \
  |  |  424|      0|		 * result. \
  |  |  425|      0|		 */ \
  |  |  426|      0|		arg = va_arg(AP, void **);
  ------------------
 2413|       |
 2414|      0|		VIPS_ARGUMENT_COLLECT_END
  ------------------
  |  |  429|      0|	}
  ------------------
 2415|  37.7k|	}
 2416|       |
 2417|   171k|	return 0;
 2418|   171k|}
vips_object_set_from_string:
 2569|  25.6k|{
 2570|  25.6k|	const char *q;
 2571|  25.6k|	VipsToken token;
 2572|  25.6k|	char buffer[VIPS_PATH_MAX];
 2573|  25.6k|	char str[VIPS_PATH_MAX];
 2574|       |
 2575|  25.6k|	g_strlcpy(buffer, string, VIPS_PATH_MAX);
  ------------------
  |  |  245|  25.6k|#define VIPS_PATH_MAX (4096)
  ------------------
 2576|       |
 2577|       |	/* Does string start with a bracket? If it doesn't, enclose the whole
 2578|       |	 * thing in [].
 2579|       |	 */
 2580|  25.6k|	if (!(q = vips__token_get(buffer, &token, str, VIPS_PATH_MAX)) ||
  ------------------
  |  |  245|  25.6k|#define VIPS_PATH_MAX (4096)
  ------------------
  |  Branch (2580:6): [True: 25.6k, False: 0]
  ------------------
 2581|  25.6k|		token != VIPS_TOKEN_LEFT)
  ------------------
  |  Branch (2581:3): [True: 0, False: 0]
  ------------------
 2582|  25.6k|		g_snprintf(buffer, VIPS_PATH_MAX, "[%s]", string);
  ------------------
  |  |  245|  25.6k|#define VIPS_PATH_MAX (4096)
  ------------------
 2583|      0|	else
 2584|      0|		g_strlcpy(buffer, string, VIPS_PATH_MAX);
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 2585|       |
 2586|  25.6k|	return vips_object_set_args(object, buffer);
 2587|  25.6k|}
vips_type_map:
 2768|  6.22M|{
 2769|  6.22M|	GType *child;
 2770|  6.22M|	guint n_children;
 2771|  6.22M|	unsigned int i;
 2772|  6.22M|	void *result;
 2773|       |
 2774|  6.22M|	child = g_type_children(base, &n_children);
 2775|  6.22M|	result = NULL;
 2776|  12.4M|	for (i = 0; i < n_children && !result; i++)
  ------------------
  |  Branch (2776:14): [True: 6.27M, False: 6.14M]
  |  Branch (2776:32): [True: 6.19M, False: 78.9k]
  ------------------
 2777|  6.19M|		result = fn(child[i], a, b);
 2778|  6.22M|	g_free(child);
 2779|       |
 2780|  6.22M|	return result;
 2781|  6.22M|}
vips_class_map_all:
 2822|  6.25M|{
 2823|  6.25M|	void *result;
 2824|       |
 2825|       |	/* Avoid abstract classes. Use type_map_all for them.
 2826|       |	 */
 2827|  6.25M|	if (!G_TYPE_IS_ABSTRACT(type)) {
  ------------------
  |  |  343|  6.25M|#define G_TYPE_IS_ABSTRACT(type)                (g_type_test_flags ((type), G_TYPE_FLAG_ABSTRACT))
  ------------------
  |  Branch (2827:6): [True: 5.04M, False: 1.20M]
  ------------------
 2828|       |		/* We never unref this ref, but we never unload classes
 2829|       |		 * anyway, so so what.
 2830|       |		 */
 2831|  5.04M|		if ((result = fn(
  ------------------
  |  Branch (2831:7): [True: 26.8k, False: 5.02M]
  ------------------
 2832|  5.04M|				 VIPS_OBJECT_CLASS(g_type_class_ref(type)), a)))
  ------------------
  |  |  435|  5.04M|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  5.04M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  5.04M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2833|  26.8k|			return result;
 2834|  5.04M|	}
 2835|       |
 2836|  6.22M|	if ((result = vips_type_map(type,
  ------------------
  |  Branch (2836:6): [True: 104k, False: 6.12M]
  ------------------
 2837|  6.22M|			 (VipsTypeMap2Fn) vips_class_map_all, fn, a)))
 2838|   104k|		return result;
 2839|       |
 2840|  6.12M|	return NULL;
 2841|  6.22M|}
vips_class_find:
 2886|  26.8k|{
 2887|  26.8k|	const char *classname = basename ? basename : "VipsObject";
  ------------------
  |  Branch (2887:26): [True: 26.8k, False: 0]
  ------------------
 2888|       |
 2889|  26.8k|	VipsObjectClass *class;
 2890|  26.8k|	GType base;
 2891|       |
 2892|  26.8k|	if (!(base = g_type_from_name(classname)))
  ------------------
  |  Branch (2892:6): [True: 0, False: 26.8k]
  ------------------
 2893|      0|		return NULL;
 2894|  26.8k|	class = vips_class_map_all(base,
 2895|  26.8k|		(VipsClassMapFn) test_name, (void *) nickname);
 2896|       |
 2897|  26.8k|	return class;
 2898|  26.8k|}
vips_type_find:
 2968|   171k|{
 2969|   171k|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|   171k|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
 2970|       |
 2971|   171k|	const char *classname = basename ? basename : "VipsObject";
  ------------------
  |  Branch (2971:26): [True: 171k, False: 0]
  ------------------
 2972|       |
 2973|   171k|	NicknameGType *hit;
 2974|   171k|	GType base;
 2975|   171k|	GType type;
 2976|       |
 2977|   171k|	VIPS_ONCE(&once, vips_class_build_hash_cb, NULL);
  ------------------
  |  |   93|   171k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   171k|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|   171k|	{ \
  |  |   95|   171k|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|   171k|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|   171k| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   171k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|   171k|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|   171k|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 171k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|   171k|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|   171k|   else                                         \
  |  |  |  |  |  |  931|   171k|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|   171k|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|   171k|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 171k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|   171k|			(void) g_once(ONCE, FUNC, CLIENT); \
  |  |  ------------------
  |  |  |  |  241|      1|  (((once)->status == G_ONCE_STATUS_READY) ? \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (241:4): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  |  |  242|      1|   (once)->retval : \
  |  |  |  |  243|      1|   g_once_impl ((once), (func), (arg)))
  |  |  ------------------
  |  |   97|   171k|	} \
  |  |   98|   171k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   171k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2978|       |
 2979|   171k|	hit = (NicknameGType *)
 2980|   171k|		g_hash_table_lookup(vips__object_nickname_table, (void *) nickname);
 2981|       |
 2982|       |	/* We must only search below basename ... check that the cache hit is
 2983|       |	 * in the right part of the tree.
 2984|       |	 */
 2985|   171k|	if (!(base = g_type_from_name(classname)))
  ------------------
  |  Branch (2985:6): [True: 0, False: 171k]
  ------------------
 2986|      0|		return 0;
 2987|   171k|	if (hit &&
  ------------------
  |  Branch (2987:6): [True: 146k, False: 25.6k]
  ------------------
 2988|   171k|		!hit->duplicate &&
  ------------------
  |  Branch (2988:3): [True: 144k, False: 1.14k]
  ------------------
 2989|   171k|		g_type_is_a(hit->type, base))
  ------------------
  |  Branch (2989:3): [True: 144k, False: 0]
  ------------------
 2990|   144k|		type = hit->type;
 2991|  26.8k|	else {
 2992|  26.8k|		const VipsObjectClass *class;
 2993|       |
 2994|  26.8k|		if (!(class = vips_class_find(basename, nickname)))
  ------------------
  |  Branch (2994:7): [True: 0, False: 26.8k]
  ------------------
 2995|      0|			return 0;
 2996|       |
 2997|  26.8k|		type = G_OBJECT_CLASS_TYPE(class);
  ------------------
  |  |  114|  26.8k|#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
  |  |  ------------------
  |  |  |  |  613|  26.8k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  ------------------
  ------------------
 2998|  26.8k|	}
 2999|       |
 3000|   171k|	return type;
 3001|   171k|}
vips_object_local_cb:
 3030|  33.9k|{
 3031|  33.9k|	VIPS_FREEF(g_object_unref, gobject);
  ------------------
  |  |   41|  33.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  33.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  33.9k|	{ \
  |  |   43|  33.9k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 33.9k, False: 0]
  |  |  ------------------
  |  |   44|  33.9k|			(void) F((S)); \
  |  |   45|  33.9k|			(S) = 0; \
  |  |   46|  33.9k|		} \
  |  |   47|  33.9k|	} \
  |  |   48|  33.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  33.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3032|  33.9k|}
vips_object_local_array:
 3082|   156k|{
 3083|   156k|	VipsObjectLocal *local;
 3084|       |
 3085|   156k|	local = g_new(VipsObjectLocal, 1);
  ------------------
  |  |  282|   156k|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|   156k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   156k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   156k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   156k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   156k|	  gpointer __p;						\
  |  |  |  |  231|   156k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 156k]
  |  |  |  |  ------------------
  |  |  |  |  232|   156k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   156k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 156k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|   156k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 156k]
  |  |  |  |  |  Branch (234:26): [True: 156k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   156k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   156k|	  else							\
  |  |  |  |  237|   156k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   156k|	  __p;							\
  |  |  |  |  239|   156k|	}))
  |  |  ------------------
  ------------------
 3086|   156k|	local->n = n;
 3087|       |	/* Make the array 1 too long so we can be sure there's a NULL
 3088|       |	 * terminator.
 3089|       |	 */
 3090|   156k|	local->array = g_new0(VipsObject *, n + 1);
  ------------------
  |  |  299|   156k|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|   156k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   156k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   156k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   156k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   156k|	  gpointer __p;						\
  |  |  |  |  231|   156k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 156k]
  |  |  |  |  ------------------
  |  |  |  |  232|   156k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   156k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 0, False: 156k]
  |  |  |  |  ------------------
  |  |  |  |  234|   156k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 0]
  |  |  |  |  |  Branch (234:26): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   156k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   156k|	  else							\
  |  |  |  |  237|   156k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   156k|	  __p;							\
  |  |  |  |  239|   156k|	}))
  |  |  ------------------
  ------------------
 3091|       |
 3092|   156k|	g_signal_connect(parent, "close",
  ------------------
  |  |  491|   156k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
 3093|   156k|		G_CALLBACK(vips_object_local_array_cb), local);
 3094|       |
 3095|   156k|	return local->array;
 3096|   156k|}
vips_object_unref_outputs:
 3233|  10.1k|{
 3234|  10.1k|	(void) vips_argument_map(object,
 3235|  10.1k|		vips_object_unref_outputs_sub, NULL, NULL);
 3236|  10.1k|}
object.c:vips_object_class_init:
 1559|      1|{
 1560|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1561|       |
 1562|       |	/* We must have threads set up before we can process.
 1563|       |	 */
 1564|      1|	vips_check_init();
 1565|       |
 1566|      1|	if (!vips__object_all)
  ------------------
  |  Branch (1566:6): [True: 1, False: 0]
  ------------------
 1567|      1|		vips__object_all = g_hash_table_new(g_direct_hash, g_direct_equal);
 1568|       |
 1569|      1|	gobject_class->dispose = vips_object_dispose;
 1570|      1|	gobject_class->finalize = vips_object_finalize;
 1571|      1|	gobject_class->set_property = vips_object_set_property;
 1572|      1|	gobject_class->get_property = vips_object_get_property;
 1573|       |
 1574|      1|	class->build = vips_object_real_build;
 1575|      1|	class->postbuild = vips_object_real_postbuild;
 1576|      1|	class->summary_class = vips_object_real_summary_class;
 1577|      1|	class->summary = vips_object_real_summary;
 1578|      1|	class->dump = vips_object_real_dump;
 1579|      1|	class->sanity = vips_object_real_sanity;
 1580|      1|	class->rewind = vips_object_real_rewind;
 1581|      1|	class->new_from_string = vips_object_real_new_from_string;
 1582|      1|	class->to_string = vips_object_real_to_string;
 1583|      1|	class->nickname = "object";
 1584|      1|	class->description = _("base class");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1585|       |
 1586|       |	/* Table of VipsArgumentClass ... we can just g_free() them.
 1587|       |	 */
 1588|      1|	class->argument_table = g_hash_table_new_full(
 1589|      1|		g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) g_free);
 1590|      1|	class->argument_table_traverse = NULL;
 1591|       |
 1592|       |	/* For setting double arguments from the command-line.
 1593|       |	 */
 1594|      1|	g_value_register_transform_func(G_TYPE_STRING, G_TYPE_DOUBLE,
  ------------------
  |  |  154|      1|#define G_TYPE_STRING			G_TYPE_MAKE_FUNDAMENTAL (16)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              	g_value_register_transform_func(G_TYPE_STRING, G_TYPE_DOUBLE,
  ------------------
  |  |  148|      1|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1595|      1|		transform_string_double);
 1596|       |
 1597|      1|	VIPS_ARG_STRING(class, "nickname", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1598|      1|		_("Nickname"),
 1599|      1|		_("Class nickname"),
 1600|      1|		VIPS_ARGUMENT_SET_ONCE,
 1601|      1|		G_STRUCT_OFFSET(VipsObject, nickname),
 1602|      1|		"");
 1603|       |
 1604|      1|	VIPS_ARG_STRING(class, "description", 2,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1605|      1|		_("Description"),
 1606|      1|		_("Class description"),
 1607|      1|		VIPS_ARGUMENT_SET_ONCE,
 1608|      1|		G_STRUCT_OFFSET(VipsObject, description),
 1609|      1|		"");
 1610|       |
 1611|       |	/**
 1612|       |	 * VipsObject::postbuild:
 1613|       |	 * @object: the object that has been built
 1614|       |	 *
 1615|       |	 * The ::postbuild signal is emitted once just after successful object
 1616|       |	 * construction. Return non-zero to cause object construction to fail.
 1617|       |	 */
 1618|      1|	vips_object_signals[SIG_POSTBUILD] = g_signal_new("postbuild",
 1619|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
 1620|      1|		G_SIGNAL_RUN_LAST,
 1621|      1|		G_STRUCT_OFFSET(VipsObjectClass, postbuild),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
 1622|      1|		NULL, NULL,
 1623|      1|		vips_INT__VOID,
 1624|      1|		G_TYPE_INT, 0);
  ------------------
  |  |   94|      1|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1625|       |
 1626|       |	/**
 1627|       |	 * VipsObject::preclose:
 1628|       |	 * @object: the object that is to close
 1629|       |	 *
 1630|       |	 * The ::preclose signal is emitted once just before object close
 1631|       |	 * starts. The object is still alive.
 1632|       |	 */
 1633|      1|	vips_object_signals[SIG_PRECLOSE] = g_signal_new("preclose",
 1634|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
 1635|      1|		G_SIGNAL_RUN_LAST,
 1636|      1|		G_STRUCT_OFFSET(VipsObjectClass, preclose),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
 1637|      1|		NULL, NULL,
 1638|      1|		g_cclosure_marshal_VOID__VOID,
 1639|      1|		G_TYPE_NONE, 0);
  ------------------
  |  |   62|      1|#define G_TYPE_NONE			G_TYPE_MAKE_FUNDAMENTAL (1)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1640|       |
 1641|       |	/**
 1642|       |	 * VipsObject::close:
 1643|       |	 * @object: the object that is closing
 1644|       |	 *
 1645|       |	 * The ::close signal is emitted once during object close. The object
 1646|       |	 * is dying and may not work.
 1647|       |	 */
 1648|      1|	vips_object_signals[SIG_CLOSE] = g_signal_new("close",
 1649|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
 1650|      1|		G_SIGNAL_RUN_LAST,
 1651|      1|		G_STRUCT_OFFSET(VipsObjectClass, close),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
 1652|      1|		NULL, NULL,
 1653|      1|		g_cclosure_marshal_VOID__VOID,
 1654|      1|		G_TYPE_NONE, 0);
  ------------------
  |  |   62|      1|#define G_TYPE_NONE			G_TYPE_MAKE_FUNDAMENTAL (1)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1655|       |
 1656|       |	/**
 1657|       |	 * VipsObject::postclose:
 1658|       |	 * @object: the object that has closed
 1659|       |	 *
 1660|       |	 * The ::postclose signal is emitted once after object close. The
 1661|       |	 * object pointer is still valid, but nothing else.
 1662|       |	 */
 1663|      1|	vips_object_signals[SIG_POSTCLOSE] = g_signal_new("postclose",
 1664|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
 1665|      1|		G_SIGNAL_RUN_LAST,
 1666|      1|		G_STRUCT_OFFSET(VipsObjectClass, postclose),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
 1667|      1|		NULL, NULL,
 1668|      1|		g_cclosure_marshal_VOID__VOID,
 1669|      1|		G_TYPE_NONE, 0);
  ------------------
  |  |   62|      1|#define G_TYPE_NONE			G_TYPE_MAKE_FUNDAMENTAL (1)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1670|      1|}
object.c:vips_object_dispose:
 1000|   837k|{
 1001|   837k|	VipsObject *object = VIPS_OBJECT(gobject);
  ------------------
  |  |  433|   837k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   837k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   837k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1002|       |
 1003|       |#ifdef DEBUG
 1004|       |	printf("vips_object_dispose: ");
 1005|       |	vips_object_print_name(object);
 1006|       |	printf("\n");
 1007|       |#endif /*DEBUG*/
 1008|       |
 1009|       |	/* Our subclasses should have already called this. Run it again, just
 1010|       |	 * in case.
 1011|       |	 */
 1012|       |#ifdef DEBUG
 1013|       |	if (!object->preclose)
 1014|       |		printf("vips_object_dispose: pre-close missing!\n");
 1015|       |#endif /*DEBUG*/
 1016|   837k|	vips_object_preclose(object);
 1017|       |
 1018|       |	/* Clear all our arguments: they may be holding resources we should
 1019|       |	 * drop.
 1020|       |	 */
 1021|   837k|	vips_argument_dispose_all(object);
 1022|       |
 1023|   837k|	vips_object_close(object);
 1024|       |
 1025|   837k|	vips_object_postclose(object);
 1026|       |
 1027|   837k|	vips_argument_free_all(object);
 1028|       |
 1029|   837k|	VIPS_FREEF(vips_argument_table_destroy, object->argument_table);
  ------------------
  |  |   41|   837k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   837k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   837k|	{ \
  |  |   43|   837k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 837k, False: 0]
  |  |  ------------------
  |  |   44|   837k|			(void) F((S)); \
  |  |   45|   837k|			(S) = 0; \
  |  |   46|   837k|		} \
  |  |   47|   837k|	} \
  |  |   48|   837k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   837k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1030|       |
 1031|   837k|	G_OBJECT_CLASS(vips_object_parent_class)->dispose(gobject);
  ------------------
  |  |   58|   837k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|   837k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   837k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1032|   837k|}
object.c:vips_argument_dispose_all:
  947|   837k|{
  948|       |#ifdef DEBUG
  949|       |	printf("vips_argument_dispose_all: ");
  950|       |	vips_object_print_name(object);
  951|       |	printf("\n");
  952|       |#endif /*DEBUG*/
  953|       |
  954|   837k|	vips_argument_map(object, vips_object_dispose_argument, NULL, NULL);
  955|   837k|}
object.c:vips_object_dispose_argument:
  916|  6.55M|{
  917|  6.55M|	g_assert(((VipsArgument *) argument_class)->pspec == pspec);
  ------------------
  |  |  166|  6.55M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  6.55M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  6.55M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  918|  6.55M|	g_assert(((VipsArgument *) argument_instance)->pspec == pspec);
  ------------------
  |  |  166|  6.55M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  6.55M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  6.55M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  919|       |
  920|  6.55M|	if (G_IS_PARAM_SPEC_OBJECT(pspec) ||
  ------------------
  |  |  491|  13.1M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  6.55M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  6.55M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  6.55M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  6.55M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  6.55M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 6.55M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  6.55M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  6.55M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 6.55M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 318k, False: 6.23M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  6.55M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   318k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   318k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  6.55M|  else \
  |  |  |  |  |  | 2321|  6.55M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  6.55M|  __r; \
  |  |  |  |  |  | 2323|  6.55M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 318k, False: 6.23M]
  |  |  ------------------
  ------------------
  921|  6.55M|		G_IS_PARAM_SPEC_BOXED(pspec)) {
  ------------------
  |  |  416|  6.23M|#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
  |  |  ------------------
  |  |  |  |  497|  6.23M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  6.23M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  6.23M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  6.23M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  6.23M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 6.23M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  6.23M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  6.23M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 6.23M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 155k, False: 6.08M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  6.23M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   155k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   155k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  6.23M|  else \
  |  |  |  |  |  | 2321|  6.23M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  6.23M|  __r; \
  |  |  |  |  |  | 2323|  6.23M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (416:44): [True: 155k, False: 6.08M]
  |  |  ------------------
  ------------------
  922|       |#ifdef DEBUG
  923|       |		printf("vips_object_dispose_argument: ");
  924|       |		vips_object_print_name(object);
  925|       |		printf(".%s\n", g_param_spec_get_name(pspec));
  926|       |#endif /*DEBUG*/
  927|       |
  928|   474k|		g_object_set(object,
  929|   474k|			g_param_spec_get_name(pspec), NULL,
  930|   474k|			NULL);
  931|   474k|	}
  932|       |
  933|  6.55M|	return NULL;
  934|  6.55M|}
object.c:vips_object_close:
  286|   837k|{
  287|   837k|	if (!object->close) {
  ------------------
  |  Branch (287:6): [True: 837k, False: 0]
  ------------------
  288|   837k|		object->close = TRUE;
  ------------------
  |  |  798|   837k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   837k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  289|       |
  290|       |#ifdef DEBUG
  291|       |		printf("vips_object_close: ");
  292|       |		vips_object_print_name(object);
  293|       |		printf("\n");
  294|       |#endif /*DEBUG*/
  295|       |
  296|   837k|		g_signal_emit(object, vips_object_signals[SIG_CLOSE], 0);
  297|   837k|	}
  298|   837k|}
object.c:vips_object_postclose:
  302|   837k|{
  303|   837k|	if (!object->postclose) {
  ------------------
  |  Branch (303:6): [True: 837k, False: 0]
  ------------------
  304|   837k|		object->postclose = TRUE;
  ------------------
  |  |  798|   837k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   837k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  305|       |
  306|       |#ifdef DEBUG
  307|       |		printf("vips_object_postclose: ");
  308|       |		vips_object_print_name(object);
  309|       |		printf("\n");
  310|       |#endif /*DEBUG*/
  311|       |
  312|   837k|		g_signal_emit(object, vips_object_signals[SIG_POSTCLOSE], 0);
  313|   837k|	}
  314|   837k|}
object.c:vips_argument_free_all:
  988|   837k|{
  989|       |#ifdef DEBUG
  990|       |	printf("vips_argument_free_all: ");
  991|       |	vips_object_print_name(object);
  992|       |	printf("\n");
  993|       |#endif /*DEBUG*/
  994|       |
  995|   837k|	vips_argument_map(object, vips_object_free_argument, NULL, NULL);
  996|   837k|}
object.c:vips_object_free_argument:
  964|  6.55M|{
  965|  6.55M|	g_assert(((VipsArgument *) argument_class)->pspec == pspec);
  ------------------
  |  |  166|  6.55M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  6.55M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  6.55M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  966|  6.55M|	g_assert(((VipsArgument *) argument_instance)->pspec == pspec);
  ------------------
  |  |  166|  6.55M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  6.55M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  6.55M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  967|       |
  968|  6.55M|	if (G_IS_PARAM_SPEC_STRING(pspec)) {
  ------------------
  |  |  370|  6.55M|#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
  |  |  ------------------
  |  |  |  |  497|  6.55M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  6.55M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  6.55M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  6.55M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  6.55M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 6.55M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  6.55M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  6.55M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 6.55M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 2.17M, False: 4.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  6.55M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  2.17M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  2.17M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  6.55M|  else \
  |  |  |  |  |  | 2321|  6.55M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  6.55M|  __r; \
  |  |  |  |  |  | 2323|  6.55M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (370:44): [True: 2.17M, False: 4.38M]
  |  |  ------------------
  ------------------
  969|       |#ifdef DEBUG
  970|       |		printf("vips_object_free_argument: ");
  971|       |		vips_object_print_name(object);
  972|       |		printf(".%s\n", g_param_spec_get_name(pspec));
  973|       |#endif /*DEBUG*/
  974|       |
  975|  2.17M|		g_object_set(object,
  976|  2.17M|			g_param_spec_get_name(pspec), NULL,
  977|  2.17M|			NULL);
  978|  2.17M|	}
  979|       |
  980|  6.55M|	return NULL;
  981|  6.55M|}
object.c:vips_argument_table_destroy:
  576|   837k|{
  577|   837k|	g_hash_table_destroy(table);
  578|   837k|}
object.c:vips_object_finalize:
 1036|   837k|{
 1037|   837k|	VipsObject *object = VIPS_OBJECT(gobject);
  ------------------
  |  |  433|   837k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   837k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   837k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1038|       |
 1039|       |#ifdef DEBUG
 1040|       |	printf("vips_object_finalize: ");
 1041|       |	vips_object_print_name(object);
 1042|       |	printf("\n");
 1043|       |#endif /*DEBUG*/
 1044|       |
 1045|       |	/* I'd like to have post-close in here, but you can't emit signals
 1046|       |	 * from finalize, sadly.
 1047|       |	 */
 1048|       |
 1049|   837k|	g_mutex_lock(&vips__object_all_lock);
 1050|   837k|	g_hash_table_remove(vips__object_all, object);
 1051|   837k|	g_mutex_unlock(&vips__object_all_lock);
 1052|       |
 1053|   837k|	G_OBJECT_CLASS(vips_object_parent_class)->finalize(gobject);
  ------------------
  |  |   58|   837k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|   837k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   837k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1054|   837k|}
object.c:vips_object_real_build:
 1423|   828k|{
 1424|   828k|	VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|   828k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|   828k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   828k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1425|       |
 1426|       |	/* Only test input args, output ones can be set by our subclasses as
 1427|       |	 * they build. See vips_object_build() above.
 1428|       |	 */
 1429|   828k|	VipsArgumentFlags iomask = VIPS_ARGUMENT_INPUT;
 1430|       |
 1431|   828k|	int result;
 1432|       |
 1433|       |#ifdef DEBUG
 1434|       |	printf("vips_object_real_build: ");
 1435|       |	vips_object_print_name(object);
 1436|       |	printf("\n");
 1437|       |#endif /*DEBUG*/
 1438|       |
 1439|   828k|	g_assert(!object->constructed);
  ------------------
  |  |  166|   828k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   828k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   828k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1440|       |
 1441|       |	/* It'd be nice if this just copied a pointer rather than did a
 1442|       |	 * strdup(). Set these here rather than in object_init, so that the
 1443|       |	 * class gets a chance to set them.
 1444|       |	 */
 1445|   828k|	g_object_set(object,
 1446|   828k|		"nickname", object_class->nickname,
 1447|   828k|		"description", object_class->description, NULL);
 1448|       |
 1449|       |	/* Check all required input arguments have been supplied, don't stop
 1450|       |	 * on 1st error.
 1451|       |	 */
 1452|   828k|	result = 0;
 1453|   828k|	(void) vips_argument_map(object,
 1454|   828k|		vips_object_check_required, &result, &iomask);
 1455|       |
 1456|   828k|	return result;
 1457|   828k|}
object.c:vips_object_real_postbuild:
 1461|   819k|{
 1462|       |#ifdef DEBUG
 1463|       |	printf("vips_object_real_postbuild: ");
 1464|       |	vips_object_print_name(object);
 1465|       |	printf("\n");
 1466|       |#endif /*DEBUG*/
 1467|       |
 1468|   819k|	g_assert(object->constructed);
  ------------------
  |  |  166|   819k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   819k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   819k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1469|       |
 1470|   819k|	return 0;
 1471|   819k|}
object.c:vips_object_init:
 1674|   838k|{
 1675|       |#ifdef DEBUG
 1676|       |	printf("vips_object_init: ");
 1677|       |	vips_object_print_name(object);
 1678|       |	printf("\n");
 1679|       |#endif /*DEBUG*/
 1680|       |
 1681|   838k|	g_mutex_lock(&vips__object_all_lock);
 1682|   838k|	g_hash_table_insert(vips__object_all, object, object);
 1683|   838k|	g_mutex_unlock(&vips__object_all_lock);
 1684|   838k|}
object.c:vips_object_check_required:
  321|  12.8M|{
  322|  12.8M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  12.8M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  12.8M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  12.8M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  323|       |
  324|  12.8M|	int *result = (int *) a;
  325|  12.8M|	VipsArgumentFlags *iomask = (VipsArgumentFlags *) b;
  326|       |
  327|  12.8M|	VIPS_DEBUG_MSG("vips_object_check_required: %s\n",
  ------------------
  |  |   47|  12.8M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  12.8M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  12.8M|	{ \
  |  |   49|  12.8M|		; \
  |  |   50|  12.8M|	} \
  |  |   51|  12.8M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.8M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  328|  12.8M|		g_param_spec_get_name(pspec));
  329|  12.8M|	VIPS_DEBUG_MSG("\trequired: %d\n",
  ------------------
  |  |   47|  12.8M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  12.8M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  12.8M|	{ \
  |  |   49|  12.8M|		; \
  |  |   50|  12.8M|	} \
  |  |   51|  12.8M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.8M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|  12.8M|		argument_class->flags & VIPS_ARGUMENT_REQUIRED);
  331|  12.8M|	VIPS_DEBUG_MSG("\tconstruct: %d\n",
  ------------------
  |  |   47|  12.8M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  12.8M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  12.8M|	{ \
  |  |   49|  12.8M|		; \
  |  |   50|  12.8M|	} \
  |  |   51|  12.8M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.8M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|  12.8M|		argument_class->flags & VIPS_ARGUMENT_CONSTRUCT);
  333|  12.8M|	VIPS_DEBUG_MSG("\tinput: %d\n",
  ------------------
  |  |   47|  12.8M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  12.8M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  12.8M|	{ \
  |  |   49|  12.8M|		; \
  |  |   50|  12.8M|	} \
  |  |   51|  12.8M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.8M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  334|  12.8M|		argument_class->flags & VIPS_ARGUMENT_INPUT);
  335|  12.8M|	VIPS_DEBUG_MSG("\toutput: %d\n",
  ------------------
  |  |   47|  12.8M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  12.8M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  12.8M|	{ \
  |  |   49|  12.8M|		; \
  |  |   50|  12.8M|	} \
  |  |   51|  12.8M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.8M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  336|  12.8M|		argument_class->flags & VIPS_ARGUMENT_OUTPUT);
  337|  12.8M|	VIPS_DEBUG_MSG("\tassigned: %d\n",
  ------------------
  |  |   47|  12.8M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  12.8M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  12.8M|	{ \
  |  |   49|  12.8M|		; \
  |  |   50|  12.8M|	} \
  |  |   51|  12.8M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.8M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  338|  12.8M|		argument_instance->assigned);
  339|       |
  340|  12.8M|	if ((argument_class->flags & VIPS_ARGUMENT_REQUIRED) &&
  ------------------
  |  Branch (340:6): [True: 752k, False: 12.0M]
  ------------------
  341|  12.8M|		(argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (341:3): [True: 752k, False: 0]
  ------------------
  342|  12.8M|		!(argument_class->flags & VIPS_ARGUMENT_DEPRECATED) &&
  ------------------
  |  Branch (342:3): [True: 752k, False: 0]
  ------------------
  343|  12.8M|		(argument_class->flags & *iomask) &&
  ------------------
  |  Branch (343:3): [True: 601k, False: 151k]
  ------------------
  344|  12.8M|		!argument_instance->assigned) {
  ------------------
  |  Branch (344:3): [True: 0, False: 601k]
  ------------------
  345|      0|		vips_error(class->nickname,
  346|      0|			_("parameter %s not set"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  347|      0|			g_param_spec_get_name(pspec));
  348|      0|		*result = -1;
  349|      0|	}
  350|       |
  351|  12.8M|	return NULL;
  352|  12.8M|}
object.c:vips_object_postbuild:
  254|   819k|{
  255|   819k|	int result;
  256|       |
  257|       |#ifdef DEBUG
  258|       |	printf("vips_object_postbuild: ");
  259|       |	vips_object_print_name(object);
  260|       |	printf("\n");
  261|       |#endif /*DEBUG*/
  262|       |
  263|   819k|	g_signal_emit(object, vips_object_signals[SIG_POSTBUILD], 0, &result);
  264|       |
  265|   819k|	return result;
  266|   819k|}
object.c:vips_argument_init:
  692|  50.1M|{
  693|  50.1M|	if (!object->argument_table) {
  ------------------
  |  Branch (693:6): [True: 838k, False: 49.3M]
  ------------------
  694|       |#ifdef DEBUG
  695|       |		printf("vips_argument_init: ");
  696|       |		vips_object_print_name(object);
  697|       |		printf("\n");
  698|       |#endif /*DEBUG*/
  699|       |
  700|   838k|		object->argument_table = g_hash_table_new_full(g_direct_hash,
  701|   838k|			g_direct_equal, NULL,
  702|   838k|			(GDestroyNotify) vips_argument_instance_free);
  703|       |
  704|       |		/* Make a VipsArgumentInstance for each installed argument
  705|       |		 * property. We can't use vips_argument_map() since that does
  706|       |		 * some sanity checks that won't pass until all arg instance
  707|       |		 * are built.
  708|       |		 */
  709|  6.56M|		VIPS_ARGUMENT_FOR_ALL(object,
  ------------------
  |  |  358|   838k|	{ \
  |  |  359|   838k|		VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(OBJECT); \
  |  |  ------------------
  |  |  |  |  441|   838k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  527|   838k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2310|   838k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  360|   838k|		GSList *p; \
  |  |  361|   838k|\
  |  |  362|  7.39M|		for (p = object_class->argument_table_traverse; p; p = p->next) { \
  |  |  ------------------
  |  |  |  Branch (362:51): [True: 6.56M, False: 838k]
  |  |  ------------------
  |  |  363|  6.56M|			VipsArgumentClass *ARG_CLASS = \
  |  |  364|  6.56M|				(VipsArgumentClass *) p->data; \
  |  |  365|  6.56M|			VipsArgument *argument = (VipsArgument *) argument_class; \
  |  |  366|  6.56M|			GParamSpec *PSPEC = argument->pspec; \
  |  |  367|  6.56M|			VipsArgumentInstance *ARG_INSTANCE G_GNUC_UNUSED = \
  |  |  368|  6.56M|				vips__argument_get_instance(argument_class, \
  |  |  369|  6.56M|					VIPS_OBJECT(OBJECT));
  |  |  ------------------
  |  |  |  |  433|  6.56M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  6.56M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  6.56M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  710|  6.56M|			pspec, argument_class, argument_instance)
  711|  6.56M|		{
  712|       |#ifdef DEBUG
  713|       |			printf("vips_argument_init: adding instance argument for %s\n",
  714|       |				g_param_spec_get_name(pspec));
  715|       |#endif /*DEBUG*/
  716|       |
  717|       |			/* argument_instance should be NULL since we've not
  718|       |			 * set it yet.
  719|       |			 */
  720|  6.56M|			g_assert(argument_instance == NULL);
  ------------------
  |  |  166|  6.56M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  6.56M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  6.56M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  721|       |
  722|  6.56M|			argument_instance = g_new(VipsArgumentInstance, 1);
  ------------------
  |  |  282|  6.56M|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  6.56M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  6.56M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  6.56M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  6.56M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  6.56M|	  gpointer __p;						\
  |  |  |  |  231|  6.56M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 6.56M]
  |  |  |  |  ------------------
  |  |  |  |  232|  6.56M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  6.56M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 6.56M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  6.56M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 6.56M]
  |  |  |  |  |  Branch (234:26): [True: 6.56M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  6.56M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  6.56M|	  else							\
  |  |  |  |  237|  6.56M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  6.56M|	  __p;							\
  |  |  |  |  239|  6.56M|	}))
  |  |  ------------------
  ------------------
  723|       |
  724|  6.56M|			((VipsArgument *) argument_instance)->pspec = pspec;
  725|  6.56M|			argument_instance->argument_class = argument_class;
  726|  6.56M|			argument_instance->object = object;
  727|       |			/* SET_ALWAYS args default to assigned.
  728|       |			 */
  729|  6.56M|			argument_instance->assigned =
  730|  6.56M|				argument_class->flags &
  731|  6.56M|				VIPS_ARGUMENT_SET_ALWAYS;
  732|  6.56M|			argument_instance->close_id = 0;
  733|  6.56M|			argument_instance->invalidate_id = 0;
  734|       |
  735|  6.56M|			vips_argument_table_replace(object->argument_table,
  736|  6.56M|				(VipsArgument *) argument_instance);
  737|  6.56M|		}
  738|  6.56M|		VIPS_ARGUMENT_FOR_ALL_END
  ------------------
  |  |  372|  6.56M|	} \
  |  |  373|   838k|	}
  ------------------
  739|   838k|	}
  740|  50.1M|}
object.c:vips_argument_instance_free:
  551|  6.55M|{
  552|  6.55M|	vips_argument_instance_detach(argument_instance);
  553|  6.55M|	g_free(argument_instance);
  554|  6.55M|}
object.c:vips_argument_instance_detach:
  517|  7.33M|{
  518|  7.33M|	VipsObject *object = argument_instance->object;
  519|  7.33M|	VipsArgumentClass *argument_class = argument_instance->argument_class;
  520|       |
  521|  7.33M|	if (argument_instance->close_id) {
  ------------------
  |  Branch (521:6): [True: 150k, False: 7.18M]
  ------------------
  522|       |		/* If close_id is set, the argument must be a gobject of some
  523|       |		 * sort, so we can fetch it.
  524|       |		 */
  525|   150k|		GObject *member = G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|   150k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   150k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
  526|   150k|			argument_class->offset);
  527|       |
  528|   150k|		if (g_signal_handler_is_connected(member,
  ------------------
  |  Branch (528:7): [True: 150k, False: 0]
  ------------------
  529|   150k|				argument_instance->close_id))
  530|   150k|			g_signal_handler_disconnect(member,
  531|   150k|				argument_instance->close_id);
  532|   150k|		argument_instance->close_id = 0;
  533|   150k|	}
  534|       |
  535|  7.33M|	if (argument_instance->invalidate_id) {
  ------------------
  |  Branch (535:6): [True: 145k, False: 7.19M]
  ------------------
  536|   145k|		GObject *member = G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|   145k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   145k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
  537|   145k|			argument_class->offset);
  538|       |
  539|   145k|		if (g_signal_handler_is_connected(member,
  ------------------
  |  Branch (539:7): [True: 145k, False: 0]
  ------------------
  540|   145k|				argument_instance->invalidate_id))
  541|   145k|			g_signal_handler_disconnect(member,
  542|   145k|				argument_instance->invalidate_id);
  543|   145k|		argument_instance->invalidate_id = 0;
  544|   145k|	}
  545|  7.33M|}
object.c:vips_object_clear_member:
  871|   779k|{
  872|   779k|	VipsObject *object = argument_instance->object;
  873|   779k|	VipsArgumentClass *argument_class = argument_instance->argument_class;
  874|   779k|	GObject **member = &G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|   779k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   779k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
  875|   779k|		argument_class->offset);
  876|       |
  877|   779k|	vips_argument_instance_detach(argument_instance);
  878|       |
  879|   779k|	if (*member) {
  ------------------
  |  Branch (879:6): [True: 309k, False: 469k]
  ------------------
  880|   309k|		if (argument_class->flags & VIPS_ARGUMENT_INPUT) {
  ------------------
  |  Branch (880:7): [True: 158k, False: 150k]
  ------------------
  881|       |#ifdef DEBUG_REF
  882|       |			printf("vips_object_clear_member: vips object: ");
  883|       |			vips_object_print_name(object);
  884|       |			printf("  no longer refers to gobject %s (%p)\n",
  885|       |				G_OBJECT_TYPE_NAME(*member), *member);
  886|       |			printf("  count down to %d\n", G_OBJECT(*member)->ref_count - 1);
  887|       |#endif /*DEBUG_REF*/
  888|       |
  889|       |			/* We reffed the object.
  890|       |			 */
  891|   158k|			g_object_unref(*member);
  892|   158k|		}
  893|   150k|		else if (argument_class->flags & VIPS_ARGUMENT_OUTPUT) {
  ------------------
  |  Branch (893:12): [True: 150k, False: 0]
  ------------------
  894|       |#ifdef DEBUG_REF
  895|       |			printf("vips_object_clear_member: gobject %s (%p)\n",
  896|       |				G_OBJECT_TYPE_NAME(*member), *member);
  897|       |			printf("  no longer refers to vips object: ");
  898|       |			vips_object_print_name(object);
  899|       |			printf("  count down to %d\n", G_OBJECT(object)->ref_count - 1);
  900|       |#endif /*DEBUG_REF*/
  901|       |
  902|   150k|			g_object_unref(object);
  903|   150k|		}
  904|       |
  905|   309k|		*member = NULL;
  906|   309k|	}
  907|   779k|}
object.c:vips_object_arg_close:
 1070|   150k|{
 1071|   150k|	VipsObject *object = argument_instance->object;
 1072|   150k|	GParamSpec *pspec = ((VipsArgument *) argument_instance)->pspec;
 1073|       |
 1074|       |	/* Argument had reffed us ... now it's being closed, so we NULL out
 1075|       |	 * the pointer to unref.
 1076|       |	 */
 1077|   150k|	g_object_set(object,
 1078|   150k|		g_param_spec_get_name(pspec), NULL,
 1079|   150k|		NULL);
 1080|   150k|}
object.c:vips_argument_table_replace:
  570|  6.56M|{
  571|  6.56M|	g_hash_table_replace(table, argument->pspec, argument);
  572|  6.56M|}
object.c:traverse_find_required_priority:
 1688|  2.58k|{
 1689|  2.58k|	VipsArgumentClass *argument_class = (VipsArgumentClass *) data;
 1690|  2.58k|	int priority = GPOINTER_TO_INT(a);
 1691|       |
 1692|  2.58k|	if ((argument_class->flags & VIPS_ARGUMENT_REQUIRED) &&
  ------------------
  |  Branch (1692:6): [True: 805, False: 1.78k]
  ------------------
 1693|  2.58k|		!(argument_class->flags & VIPS_ARGUMENT_DEPRECATED) &&
  ------------------
  |  Branch (1693:3): [True: 805, False: 0]
  ------------------
 1694|  2.58k|		argument_class->priority == priority)
  ------------------
  |  Branch (1694:3): [True: 0, False: 805]
  ------------------
 1695|      0|		return argument_class;
 1696|       |
 1697|  2.58k|	return NULL;
 1698|  2.58k|}
object.c:traverse_sort:
 1703|  13.9k|{
 1704|  13.9k|	return class1->priority - class2->priority;
 1705|  13.9k|}
object.c:vips_object_set_args:
 2459|  25.6k|{
 2460|  25.6k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  25.6k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  25.6k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  25.6k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2461|       |
 2462|  25.6k|	VipsToken token;
 2463|  25.6k|	char string[VIPS_PATH_MAX];
 2464|  25.6k|	char string2[VIPS_PATH_MAX];
 2465|  25.6k|	GParamSpec *pspec;
 2466|  25.6k|	VipsArgumentClass *argument_class;
 2467|  25.6k|	VipsArgumentInstance *argument_instance;
 2468|       |
 2469|  25.6k|	if (!(p = vips__token_need(p, VIPS_TOKEN_LEFT,
  ------------------
  |  Branch (2469:6): [True: 0, False: 25.6k]
  ------------------
 2470|  25.6k|			  string, VIPS_PATH_MAX)))
  ------------------
  |  |  245|  25.6k|#define VIPS_PATH_MAX (4096)
  ------------------
 2471|      0|		return -1;
 2472|       |
 2473|  25.6k|	if (!(p = vips__token_segment(p, &token, string, VIPS_PATH_MAX)))
  ------------------
  |  |  245|  25.6k|#define VIPS_PATH_MAX (4096)
  ------------------
  |  Branch (2473:6): [True: 0, False: 25.6k]
  ------------------
 2474|      0|		return -1;
 2475|       |
 2476|  25.6k|	for (;;) {
 2477|  25.6k|		if (token == VIPS_TOKEN_RIGHT)
  ------------------
  |  Branch (2477:7): [True: 25.6k, False: 0]
  ------------------
 2478|  25.6k|			break;
 2479|      0|		if (token != VIPS_TOKEN_STRING) {
  ------------------
  |  Branch (2479:7): [True: 0, False: 0]
  ------------------
 2480|      0|			vips_error(class->nickname,
 2481|      0|				_("expected string or ), saw %s"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2482|      0|				vips_enum_nick(VIPS_TYPE_TOKEN, token));
  ------------------
  |  |  178|      0|#define VIPS_TYPE_TOKEN (vips_token_get_type())
  ------------------
 2483|      0|			return -1;
 2484|      0|		}
 2485|       |
 2486|       |		/* We have to look for a '=', ']' or a ',' to see if string is
 2487|       |		 * a param name or a value.
 2488|       |		 */
 2489|      0|		if (!(p = vips__token_segment(p, &token,
  ------------------
  |  Branch (2489:7): [True: 0, False: 0]
  ------------------
 2490|      0|				  string2, VIPS_PATH_MAX)))
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 2491|      0|			return -1;
 2492|      0|		if (token == VIPS_TOKEN_EQUALS) {
  ------------------
  |  Branch (2492:7): [True: 0, False: 0]
  ------------------
 2493|      0|			if (!(p = vips__token_segment_need(p, VIPS_TOKEN_STRING,
  ------------------
  |  Branch (2493:8): [True: 0, False: 0]
  ------------------
 2494|      0|					  string2, VIPS_PATH_MAX)))
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 2495|      0|				return -1;
 2496|      0|			if (vips_object_set_argument_from_string(object,
  ------------------
  |  Branch (2496:8): [True: 0, False: 0]
  ------------------
 2497|      0|					string, string2))
 2498|      0|				return -1;
 2499|       |
 2500|      0|			if (!(p = vips__token_must(p, &token,
  ------------------
  |  Branch (2500:8): [True: 0, False: 0]
  ------------------
 2501|      0|					  string2, VIPS_PATH_MAX)))
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 2502|      0|				return -1;
 2503|      0|		}
 2504|      0|		else if (g_object_class_find_property(
  ------------------
  |  Branch (2504:12): [True: 0, False: 0]
  ------------------
 2505|      0|					 G_OBJECT_GET_CLASS(object), string) &&
  ------------------
  |  |   86|      0|#define G_OBJECT_GET_CLASS(object)  (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  527|      0|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|      0|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2506|      0|			!vips_object_get_argument(object, string,
  ------------------
  |  Branch (2506:4): [True: 0, False: 0]
  ------------------
 2507|      0|				&pspec, &argument_class, &argument_instance) &&
 2508|      0|			(argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (2508:4): [True: 0, False: 0]
  ------------------
 2509|      0|			(argument_class->flags & VIPS_ARGUMENT_INPUT) &&
  ------------------
  |  Branch (2509:4): [True: 0, False: 0]
  ------------------
 2510|      0|			G_IS_PARAM_SPEC_BOOLEAN(pspec)) {
  ------------------
  |  |   94|      0|#define G_IS_PARAM_SPEC_BOOLEAN(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
  |  |  ------------------
  |  |  |  |  497|      0|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|      0|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|      0|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|      0|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|      0|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|      0|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|      0|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|      0|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|      0|  else \
  |  |  |  |  |  | 2321|      0|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|      0|  __r; \
  |  |  |  |  |  | 2323|      0|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (94:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2511|       |			/* The string is the name of an optional
 2512|       |			 * input boolean ... set it!
 2513|       |			 */
 2514|      0|			if (!argument_instance->assigned)
  ------------------
  |  Branch (2514:8): [True: 0, False: 0]
  ------------------
 2515|      0|				g_object_set(object, string, TRUE, NULL);
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 2516|      0|		}
 2517|      0|		else if ((pspec = vips_object_find_required(object))) {
  ------------------
  |  Branch (2517:12): [True: 0, False: 0]
  ------------------
 2518|      0|			if (vips_object_set_argument_from_string(object,
  ------------------
  |  Branch (2518:8): [True: 0, False: 0]
  ------------------
 2519|      0|					g_param_spec_get_name(pspec), string))
 2520|      0|				return -1;
 2521|      0|		}
 2522|      0|		else {
 2523|      0|			vips_error(class->nickname,
 2524|      0|				_("unable to set '%s'"), string);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2525|      0|			return -1;
 2526|      0|		}
 2527|       |
 2528|       |		/* Now must be a , or a ).
 2529|       |		 */
 2530|      0|		if (token == VIPS_TOKEN_COMMA) {
  ------------------
  |  Branch (2530:7): [True: 0, False: 0]
  ------------------
 2531|      0|			if (!(p = vips__token_must(p, &token,
  ------------------
  |  Branch (2531:8): [True: 0, False: 0]
  ------------------
 2532|      0|					  string, VIPS_PATH_MAX)))
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 2533|      0|				return -1;
 2534|      0|		}
 2535|      0|		else if (token != VIPS_TOKEN_RIGHT) {
  ------------------
  |  Branch (2535:12): [True: 0, False: 0]
  ------------------
 2536|      0|			vips_error(class->nickname,
 2537|      0|				"%s", _("not , or ) after parameter"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2538|      0|			return -1;
 2539|      0|		}
 2540|      0|	}
 2541|       |
 2542|  25.6k|	if ((p = vips__token_get(p, &token, string, VIPS_PATH_MAX))) {
  ------------------
  |  |  245|  25.6k|#define VIPS_PATH_MAX (4096)
  ------------------
  |  Branch (2542:6): [True: 0, False: 25.6k]
  ------------------
 2543|      0|		vips_error(class->nickname,
 2544|      0|			"%s", _("extra tokens after ')'"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2545|      0|		return -1;
 2546|      0|	}
 2547|       |
 2548|  25.6k|	return 0;
 2549|  25.6k|}
object.c:test_name:
 2860|  4.04M|{
 2861|  4.04M|	if (g_ascii_strcasecmp(class->nickname, nickname) == 0)
  ------------------
  |  Branch (2861:6): [True: 1.14k, False: 4.03M]
  ------------------
 2862|  1.14k|		return class;
 2863|       |
 2864|       |	/* Check the class name too, why not.
 2865|       |	 */
 2866|  4.03M|	if (g_ascii_strcasecmp(G_OBJECT_CLASS_NAME(class), nickname) == 0)
  ------------------
  |  |  124|  4.03M|#define G_OBJECT_CLASS_NAME(class)  (g_type_name (G_OBJECT_CLASS_TYPE (class)))
  |  |  ------------------
  |  |  |  |  114|  4.03M|#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  4.03M|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2866:6): [True: 25.6k, False: 4.01M]
  ------------------
 2867|  25.6k|		return class;
 2868|       |
 2869|  4.01M|	return NULL;
 2870|  4.03M|}
object.c:vips_class_build_hash_cb:
 2936|      1|{
 2937|      1|	GType base;
 2938|       |
 2939|      1|	vips__object_nickname_table = g_hash_table_new(g_str_hash, g_str_equal);
 2940|       |
 2941|      1|	base = g_type_from_name("VipsObject");
 2942|      1|	g_assert(base);
  ------------------
  |  |  166|      1|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2943|       |
 2944|      1|	vips_class_map_all(base,
 2945|      1|		(VipsClassMapFn) vips_class_add_hash,
 2946|      1|		(void *) vips__object_nickname_table);
 2947|       |
 2948|      1|	return NULL;
 2949|      1|}
object.c:vips_class_add_hash:
 2911|    306|{
 2912|    306|	GType type = G_OBJECT_CLASS_TYPE(class);
  ------------------
  |  |  114|    306|#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
  |  |  ------------------
  |  |  |  |  613|    306|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  ------------------
  ------------------
 2913|    306|	NicknameGType *hit;
 2914|       |
 2915|    306|	hit = (NicknameGType *)
 2916|    306|		g_hash_table_lookup(table, (void *) class->nickname);
 2917|       |
 2918|       |	/* If this is not a unique name, mark as a duplicate. In this case
 2919|       |	 * we'll need to fall back to a search.
 2920|       |	 */
 2921|    306|	if (hit)
  ------------------
  |  Branch (2921:6): [True: 1, False: 305]
  ------------------
 2922|      1|		hit->duplicate = TRUE;
  ------------------
  |  |  798|      1|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      1|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 2923|    305|	else {
 2924|    305|		hit = g_new(NicknameGType, 1);
  ------------------
  |  |  282|    305|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|    305|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|    305|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|    305|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|    305|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|    305|	  gpointer __p;						\
  |  |  |  |  231|    305|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 305]
  |  |  |  |  ------------------
  |  |  |  |  232|    305|	    __p = g_##func (__n);				\
  |  |  |  |  233|    305|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 305, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|    305|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 305]
  |  |  |  |  |  Branch (234:26): [True: 305, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|    305|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|    305|	  else							\
  |  |  |  |  237|    305|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|    305|	  __p;							\
  |  |  |  |  239|    305|	}))
  |  |  ------------------
  ------------------
 2925|    305|		hit->nickname = class->nickname;
 2926|    305|		hit->type = type;
 2927|    305|		hit->duplicate = FALSE;
  ------------------
  |  |  794|    305|#define	FALSE	(0)
  ------------------
 2928|    305|		g_hash_table_insert(table, (void *) hit->nickname, hit);
 2929|    305|	}
 2930|       |
 2931|    306|	return NULL;
 2932|    306|}
object.c:vips_object_local_array_cb:
 3041|   156k|{
 3042|   156k|	int i;
 3043|       |
 3044|   494k|	for (i = 0; i < local->n; i++)
  ------------------
  |  Branch (3044:14): [True: 337k, False: 156k]
  ------------------
 3045|   337k|		VIPS_FREEF(g_object_unref, local->array[i]);
  ------------------
  |  |   41|   337k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   337k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   337k|	{ \
  |  |   43|   337k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 203k, False: 134k]
  |  |  ------------------
  |  |   44|   203k|			(void) F((S)); \
  |  |   45|   203k|			(S) = 0; \
  |  |   46|   203k|		} \
  |  |   47|   337k|	} \
  |  |   48|   337k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   337k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3046|       |
 3047|   156k|	VIPS_FREEF(g_free, local->array);
  ------------------
  |  |   41|   156k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   156k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   156k|	{ \
  |  |   43|   156k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 156k, False: 0]
  |  |  ------------------
  |  |   44|   156k|			(void) F((S)); \
  |  |   45|   156k|			(S) = 0; \
  |  |   46|   156k|		} \
  |  |   47|   156k|	} \
  |  |   48|   156k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   156k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3048|   156k|	VIPS_FREEF(g_free, local);
  ------------------
  |  |   41|   156k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   156k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   156k|	{ \
  |  |   43|   156k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 156k, False: 0]
  |  |  ------------------
  |  |   44|   156k|			(void) F((S)); \
  |  |   45|   156k|			(S) = 0; \
  |  |   46|   156k|		} \
  |  |   47|   156k|	} \
  |  |   48|   156k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   156k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3049|   156k|}
object.c:vips_object_unref_outputs_sub:
 3199|   171k|{
 3200|   171k|	if ((argument_class->flags & VIPS_ARGUMENT_OUTPUT) &&
  ------------------
  |  Branch (3200:6): [True: 6.57k, False: 164k]
  ------------------
 3201|   171k|		G_IS_PARAM_SPEC_OBJECT(pspec) &&
  ------------------
  |  |  491|   177k|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  6.57k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  6.57k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  6.57k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  6.57k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  6.57k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 6.57k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  6.57k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  6.57k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 6.57k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 3.28k, False: 3.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  6.57k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  3.28k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  3.28k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  6.57k|  else \
  |  |  |  |  |  | 2321|  6.57k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  6.57k|  __r; \
  |  |  |  |  |  | 2323|  6.57k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 3.28k, False: 3.28k]
  |  |  ------------------
  ------------------
 3202|   171k|		argument_instance->assigned) {
  ------------------
  |  Branch (3202:3): [True: 2.68k, False: 601]
  ------------------
 3203|  2.68k|		GObject *value;
 3204|       |
 3205|  2.68k|		g_object_get(object,
 3206|  2.68k|			g_param_spec_get_name(pspec), &value, NULL);
 3207|       |
 3208|       |		/* Doing the get refs the object, so unref the get, then unref
 3209|       |		 * again since this an an output object of the operation.
 3210|       |		 */
 3211|  2.68k|		g_object_unref(value);
 3212|  2.68k|		g_object_unref(value);
 3213|  2.68k|	}
 3214|       |
 3215|   171k|	return NULL;
 3216|   171k|}

vips_operation_get_flags:
  693|   324k|{
  694|   324k|	VipsOperationClass *class = VIPS_OPERATION_GET_CLASS(operation);
  ------------------
  |  |   67|   324k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|   324k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   324k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   68|   324k|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  695|       |
  696|   324k|	return class->get_flags(operation);
  697|   324k|}
vips_operation_invalidate:
  717|  11.2k|{
  718|       |#ifdef VIPS_DEBUG
  719|       |	printf("vips_operation_invalidate: %p\n", operation);
  720|       |	vips_object_print_summary(VIPS_OBJECT(operation));
  721|       |#endif /*VIPS_DEBUG*/
  722|       |
  723|  11.2k|	g_signal_emit(operation, vips_operation_signals[SIG_INVALIDATE], 0);
  724|  11.2k|}
vips_operation_new:
  740|   171k|{
  741|   171k|	GType type;
  742|   171k|	VipsObject *object;
  743|   171k|	VipsOperation *operation;
  744|       |
  745|   171k|	vips_check_init();
  746|       |
  747|   171k|	if (!(type = vips_type_find("VipsOperation", name))) {
  ------------------
  |  Branch (747:6): [True: 0, False: 171k]
  ------------------
  748|      0|		vips_error("VipsOperation",
  749|      0|			_("class \"%s\" not found"), name);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  750|      0|		return NULL;
  751|      0|	}
  752|       |
  753|   171k|	if (!(object = g_object_new(type, NULL))) {
  ------------------
  |  Branch (753:6): [True: 0, False: 171k]
  ------------------
  754|      0|		vips_error("VipsOperation",
  755|      0|			_("\"%s\" is not an instantiable class"), name);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  756|      0|		return NULL;
  757|      0|	}
  758|       |
  759|   171k|	operation = VIPS_OPERATION(object);
  ------------------
  |  |   57|   171k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   171k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   171k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|   171k|		VIPS_TYPE_OPERATION, VipsOperation))
  ------------------
  760|       |
  761|   171k|	VIPS_DEBUG_MSG("vips_operation_new: %s (%p)\n", name, operation);
  ------------------
  |  |   47|   171k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   171k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   171k|	{ \
  |  |   49|   171k|		; \
  |  |   50|   171k|	} \
  |  |   51|   171k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   171k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  762|       |
  763|   171k|	return operation;
  764|   171k|}
vips_call_required_optional:
  956|   171k|{
  957|   171k|	int result;
  958|   171k|	va_list a;
  959|   171k|	va_list b;
  960|       |
  961|       |	/* We need to be able to walk required and optional twice. On x64 gcc,
  962|       |	 * vips_operation_set_valist_required() etc. will destructively alter
  963|       |	 * the passed-in va_list. We make a copy and walk that instead.
  964|       |	 */
  965|   171k|	va_copy(a, required);
  966|   171k|	va_copy(b, optional);
  967|   171k|	result = vips_operation_set_valist_required(*operation, a) ||
  ------------------
  |  Branch (967:11): [True: 0, False: 171k]
  ------------------
  968|   171k|		vips_object_set_valist(VIPS_OBJECT(*operation), b);
  ------------------
  |  |  433|   171k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   171k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   171k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (968:3): [True: 0, False: 171k]
  ------------------
  969|   171k|	va_end(a);
  970|   171k|	va_end(b);
  971|       |
  972|   171k|	if (result)
  ------------------
  |  Branch (972:6): [True: 0, False: 171k]
  ------------------
  973|      0|		return -1;
  974|       |
  975|       |	/* Build from cache.
  976|       |	 */
  977|   171k|	if (vips_cache_operation_buildp(operation))
  ------------------
  |  Branch (977:6): [True: 10.1k, False: 161k]
  ------------------
  978|  10.1k|		return -1;
  979|       |
  980|       |	/* Walk args again, writing output.
  981|       |	 */
  982|   161k|	va_copy(a, required);
  983|   161k|	va_copy(b, optional);
  984|   161k|	result = vips_operation_get_valist_required(*operation, required) ||
  ------------------
  |  Branch (984:11): [True: 0, False: 161k]
  ------------------
  985|   161k|		vips_operation_get_valist_optional(*operation, optional);
  ------------------
  |  Branch (985:3): [True: 0, False: 161k]
  ------------------
  986|   161k|	va_end(a);
  987|   161k|	va_end(b);
  988|       |
  989|   161k|	return result;
  990|   171k|}
vips_call_split:
 1118|   146k|{
 1119|   146k|	int result;
 1120|   146k|	va_list required;
 1121|       |
 1122|   146k|	va_start(required, optional);
 1123|   146k|	result = vips_call_by_name(operation_name, NULL,
 1124|   146k|		required, optional);
 1125|   146k|	va_end(required);
 1126|       |
 1127|   146k|	return result;
 1128|   146k|}
vips_call_split_option_string:
 1133|  25.6k|{
 1134|  25.6k|	int result;
 1135|  25.6k|	va_list required;
 1136|       |
 1137|  25.6k|	va_start(required, optional);
 1138|  25.6k|	result = vips_call_by_name(operation_name, option_string,
 1139|  25.6k|		required, optional);
 1140|  25.6k|	va_end(required);
 1141|       |
 1142|  25.6k|	return result;
 1143|  25.6k|}
operation.c:vips_operation_class_init:
  653|      1|{
  654|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  655|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  656|       |
  657|      1|	gobject_class->finalize = vips_operation_finalize;
  658|      1|	gobject_class->dispose = vips_operation_dispose;
  659|       |
  660|      1|	vobject_class->build = vips_operation_build;
  661|      1|	vobject_class->summary = vips_operation_summary;
  662|      1|	vobject_class->dump = vips_operation_dump;
  663|      1|	vobject_class->nickname = "operation";
  664|      1|	vobject_class->description = _("operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  665|       |
  666|      1|	class->usage = vips_operation_usage;
  667|      1|	class->get_flags = vips_operation_real_get_flags;
  668|       |
  669|      1|	vips_operation_signals[SIG_INVALIDATE] = g_signal_new("invalidate",
  670|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
  671|      1|		G_SIGNAL_RUN_LAST,
  672|      1|		G_STRUCT_OFFSET(VipsOperationClass, invalidate),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
  673|      1|		NULL, NULL,
  674|      1|		g_cclosure_marshal_VOID__VOID,
  675|      1|		G_TYPE_NONE, 0);
  ------------------
  |  |   62|      1|#define G_TYPE_NONE			G_TYPE_MAKE_FUNDAMENTAL (1)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  676|      1|}
operation.c:vips_operation_finalize:
  229|   171k|{
  230|   171k|	VipsOperation *operation = VIPS_OPERATION(gobject);
  ------------------
  |  |   57|   171k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   171k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   171k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|   171k|		VIPS_TYPE_OPERATION, VipsOperation))
  ------------------
  231|       |
  232|   171k|	VIPS_DEBUG_MSG("vips_operation_finalize: %p\n", gobject);
  ------------------
  |  |   47|   171k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   171k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   171k|	{ \
  |  |   49|   171k|		; \
  |  |   50|   171k|	} \
  |  |   51|   171k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   171k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  233|       |
  234|   171k|	if (operation->pixels)
  ------------------
  |  Branch (234:6): [True: 0, False: 171k]
  ------------------
  235|      0|		g_info(_("%d pixels calculated"), operation->pixels);
  ------------------
  |  |  341|      0|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|      0|                               G_LOG_LEVEL_INFO,     \
  |  |  343|      0|                               __VA_ARGS__)
  ------------------
  236|       |
  237|   171k|	G_OBJECT_CLASS(vips_operation_parent_class)->finalize(gobject);
  ------------------
  |  |   58|   171k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|   171k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   171k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  238|   171k|}
operation.c:vips_operation_dispose:
  242|   171k|{
  243|   171k|	VIPS_DEBUG_MSG("vips_operation_dispose: %p\n", gobject);
  ------------------
  |  |   47|   171k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   171k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   171k|	{ \
  |  |   49|   171k|		; \
  |  |   50|   171k|	} \
  |  |   51|   171k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   171k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  244|       |
  245|   171k|	G_OBJECT_CLASS(vips_operation_parent_class)->dispose(gobject);
  ------------------
  |  |   58|   171k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|   171k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   171k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  246|   171k|}
operation.c:vips_operation_build:
  607|   162k|{
  608|   162k|	VipsOperationClass *class = VIPS_OPERATION_GET_CLASS(object);
  ------------------
  |  |   67|   162k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|   162k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   162k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   68|   162k|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  609|       |
  610|       |#ifdef VIPS_DEBUG
  611|       |	printf("vips_operation_build: ");
  612|       |	vips_object_print_name(object);
  613|       |	printf("\n");
  614|       |#endif /*VIPS_DEBUG*/
  615|       |
  616|   162k|	if (class->flags & VIPS_OPERATION_BLOCKED) {
  ------------------
  |  Branch (616:6): [True: 0, False: 162k]
  ------------------
  617|      0|		vips_error(VIPS_OBJECT_CLASS(class)->nickname,
  ------------------
  |  |  435|      0|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      0|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      0|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  618|      0|			"%s", _("operation is blocked"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  619|      0|		return -1;
  620|      0|	}
  621|       |
  622|   162k|	if (VIPS_OBJECT_CLASS(vips_operation_parent_class)->build(object))
  ------------------
  |  |  435|   162k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   162k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   162k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (622:6): [True: 0, False: 162k]
  ------------------
  623|      0|		return -1;
  624|       |
  625|   162k|	return 0;
  626|   162k|}
operation.c:vips_operation_real_get_flags:
  645|   324k|{
  646|   324k|	VipsOperationClass *class = VIPS_OPERATION_GET_CLASS(operation);
  ------------------
  |  |   67|   324k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|   324k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   324k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   68|   324k|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  647|       |
  648|   324k|	return class->flags;
  649|   324k|}
operation.c:vips_operation_init:
  680|   171k|{
  681|   171k|}
operation.c:vips_operation_set_valist_required:
  777|   171k|{
  778|   171k|	VIPS_DEBUG_MSG("vips_operation_set_valist_required:\n");
  ------------------
  |  |   47|   171k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   171k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   171k|	{ \
  |  |   49|   171k|		; \
  |  |   50|   171k|	} \
  |  |   51|   171k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   171k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  779|       |
  780|       |	/* Set required input arguments. Can't use vips_argument_map here
  781|       |	 * :-( because passing va_list by reference is not portable.
  782|       |	 */
  783|  1.82M|	VIPS_ARGUMENT_FOR_ALL(operation,
  ------------------
  |  |  358|   171k|	{ \
  |  |  359|   171k|		VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(OBJECT); \
  |  |  ------------------
  |  |  |  |  441|   171k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  527|   171k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2310|   171k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  360|   171k|		GSList *p; \
  |  |  361|   171k|\
  |  |  362|  1.99M|		for (p = object_class->argument_table_traverse; p; p = p->next) { \
  |  |  ------------------
  |  |  |  Branch (362:51): [True: 1.82M, False: 171k]
  |  |  ------------------
  |  |  363|  1.82M|			VipsArgumentClass *ARG_CLASS = \
  |  |  364|  1.82M|				(VipsArgumentClass *) p->data; \
  |  |  365|  1.82M|			VipsArgument *argument = (VipsArgument *) argument_class; \
  |  |  366|  1.82M|			GParamSpec *PSPEC = argument->pspec; \
  |  |  367|  1.82M|			VipsArgumentInstance *ARG_INSTANCE G_GNUC_UNUSED = \
  |  |  368|  1.82M|				vips__argument_get_instance(argument_class, \
  |  |  369|  1.82M|					VIPS_OBJECT(OBJECT));
  |  |  ------------------
  |  |  |  |  433|  1.82M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  1.82M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  1.82M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  784|  1.82M|		pspec, argument_class, argument_instance)
  785|  1.82M|	{
  786|       |
  787|  1.82M|		g_assert(argument_instance);
  ------------------
  |  |  166|  1.82M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.82M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.82M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  788|       |
  789|       |		/* We skip deprecated required args. There will be a new,
  790|       |		 * renamed arg in the same place.
  791|       |		 */
  792|  1.82M|		if ((argument_class->flags & VIPS_ARGUMENT_REQUIRED) &&
  ------------------
  |  Branch (792:7): [True: 411k, False: 1.41M]
  ------------------
  793|  1.82M|			!(argument_class->flags & VIPS_ARGUMENT_DEPRECATED)) {
  ------------------
  |  Branch (793:4): [True: 411k, False: 0]
  ------------------
  794|   501k|			VIPS_ARGUMENT_COLLECT_SET(pspec, argument_class, ap);
  ------------------
  |  |  399|   411k|	if ((ARG_CLASS->flags & VIPS_ARGUMENT_INPUT)) { \
  |  |  ------------------
  |  |  |  Branch (399:6): [True: 250k, False: 160k]
  |  |  ------------------
  |  |  400|   250k|		GValue value = G_VALUE_INIT; \
  |  |  ------------------
  |  |  |  |  191|   250k|#define G_VALUE_INIT  { 0, { { 0 } } }
  |  |  ------------------
  |  |  401|   250k|		gchar *error = NULL; \
  |  |  402|   250k|\
  |  |  403|   250k|		/* Input args are given inline, eg. ("factor", 12.0) \
  |  |  404|   250k|		 * and must be collected. \
  |  |  405|   250k|		 */ \
  |  |  406|   250k|		G_VALUE_COLLECT_INIT(&value, \
  |  |  ------------------
  |  |  |  |   88|   250k|#define G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error)		\
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   250k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   89|   250k|G_STMT_START {										\
  |  |  |  |   90|   250k|  GValue *g_vci_val = (value);								\
  |  |  |  |   91|   250k|  guint g_vci_flags = (flags);								\
  |  |  |  |   92|   250k|  GTypeValueTable *g_vci_vtab = g_type_value_table_peek (_value_type);			\
  |  |  |  |   93|   250k|  const gchar *g_vci_collect_format = g_vci_vtab->collect_format;					\
  |  |  |  |   94|   250k|  GTypeCValue g_vci_cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };		\
  |  |  |  |   95|   250k|  guint g_vci_n_values = 0;									\
  |  |  |  |   96|   250k|                                                                                        \
  |  |  |  |   97|   250k|  g_vci_val->g_type = _value_type;		/* value_meminit() from gvalue.c */		\
  |  |  |  |   98|   501k|  while (*g_vci_collect_format)								\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (98:10): [True: 250k, False: 250k]
  |  |  |  |  ------------------
  |  |  |  |   99|   250k|    {											\
  |  |  |  |  100|   250k|      GTypeCValue *g_vci_cvalue = g_vci_cvalues + g_vci_n_values++;					\
  |  |  |  |  101|   250k|                                                                                        \
  |  |  |  |  102|   250k|      switch (*g_vci_collect_format++)							\
  |  |  |  |  103|   250k|	{										\
  |  |  |  |  104|  49.8k|	case G_VALUE_COLLECT_INT:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (104:2): [True: 49.8k, False: 200k]
  |  |  |  |  ------------------
  |  |  |  |  105|  49.8k|	  g_vci_cvalue->v_int = va_arg ((var_args), gint);					\
  |  |  |  |  106|  49.8k|	  break;									\
  |  |  |  |  107|      0|	case G_VALUE_COLLECT_LONG:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:2): [True: 0, False: 250k]
  |  |  |  |  ------------------
  |  |  |  |  108|      0|	  g_vci_cvalue->v_long = va_arg ((var_args), glong);					\
  |  |  |  |  109|      0|	  break;									\
  |  |  |  |  110|      0|	case G_VALUE_COLLECT_INT64:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (110:2): [True: 0, False: 250k]
  |  |  |  |  ------------------
  |  |  |  |  111|      0|	  g_vci_cvalue->v_int64 = va_arg ((var_args), gint64);				\
  |  |  |  |  112|      0|	  break;									\
  |  |  |  |  113|      0|	case G_VALUE_COLLECT_DOUBLE:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (113:2): [True: 0, False: 250k]
  |  |  |  |  ------------------
  |  |  |  |  114|      0|	  g_vci_cvalue->v_double = va_arg ((var_args), gdouble);				\
  |  |  |  |  115|      0|	  break;									\
  |  |  |  |  116|   200k|	case G_VALUE_COLLECT_POINTER:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (116:2): [True: 200k, False: 49.8k]
  |  |  |  |  ------------------
  |  |  |  |  117|   200k|	  g_vci_cvalue->v_pointer = va_arg ((var_args), gpointer);				\
  |  |  |  |  118|   200k|	  break;									\
  |  |  |  |  119|      0|	default:									\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (119:2): [True: 0, False: 250k]
  |  |  |  |  ------------------
  |  |  |  |  120|      0|	  g_assert_not_reached ();							\
  |  |  |  |  ------------------
  |  |  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  121|   250k|	}										\
  |  |  |  |  122|   250k|    }											\
  |  |  |  |  123|   250k|  *(__error) = g_vci_vtab->collect_value (g_vci_val,						\
  |  |  |  |  124|   250k|				       g_vci_n_values,					\
  |  |  |  |  125|   250k|				       g_vci_cvalues,					\
  |  |  |  |  126|   250k|				       g_vci_flags);						\
  |  |  |  |  127|   250k|} G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   250k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  407|   250k|			G_PARAM_SPEC_VALUE_TYPE(PSPEC), AP, 0, &error); \
  |  |  408|   250k|\
  |  |  409|   250k|		/* Don't bother with the error message. \
  |  |  410|   250k|		 */ \
  |  |  411|   250k|		if (error) { \
  |  |  ------------------
  |  |  |  Branch (411:7): [True: 0, False: 250k]
  |  |  ------------------
  |  |  412|      0|			VIPS_DEBUG_MSG("VIPS_OBJECT_COLLECT_SET: err\n"); \
  |  |  ------------------
  |  |  |  |   47|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   48|      0|	{ \
  |  |  |  |   49|      0|		; \
  |  |  |  |   50|      0|	} \
  |  |  |  |   51|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  413|      0|			g_free(error); \
  |  |  414|      0|		}
  ------------------
  795|       |
  796|       |#ifdef VIPS_DEBUG
  797|       |			{
  798|       |				char *str;
  799|       |
  800|       |				str = g_strdup_value_contents(&value);
  801|       |				VIPS_DEBUG_MSG("\t%s = %s\n",
  802|       |					g_param_spec_get_name(pspec), str);
  803|       |				g_free(str);
  804|       |			}
  805|       |#endif /*VIPS_DEBUG */
  806|       |
  807|   501k|			g_object_set_property(G_OBJECT(operation),
  ------------------
  |  |   51|   250k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|   250k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   250k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  808|   501k|				g_param_spec_get_name(pspec), &value);
  809|       |
  810|   501k|			VIPS_ARGUMENT_COLLECT_GET(pspec, argument_class, ap);
  ------------------
  |  |  417|   250k|	g_value_unset(&value); \
  |  |  418|   250k|	} \
  |  |  419|   411k|	else if ((ARG_CLASS->flags & VIPS_ARGUMENT_OUTPUT)) \
  |  |  ------------------
  |  |  |  Branch (419:11): [True: 160k, False: 0]
  |  |  ------------------
  |  |  420|   160k|	{ \
  |  |  421|   160k|		void **arg G_GNUC_UNUSED; \
  |  |  422|   160k|\
  |  |  423|   160k|		/* Output args are a pointer to where to send the \
  |  |  424|   160k|		 * result. \
  |  |  425|   160k|		 */ \
  |  |  426|   160k|		arg = va_arg(AP, void **);
  ------------------
  811|       |
  812|       |#ifdef VIPS_DEBUG
  813|       |			printf("\tskipping arg %p for %s\n",
  814|       |				arg, g_param_spec_get_name(pspec));
  815|       |#endif /*VIPS_DEBUG */
  816|       |
  817|   321k|			VIPS_ARGUMENT_COLLECT_END
  ------------------
  |  |  429|   160k|	}
  ------------------
  818|   411k|		}
  819|  1.82M|	}
  820|  1.82M|	VIPS_ARGUMENT_FOR_ALL_END
  ------------------
  |  |  372|  1.82M|	} \
  |  |  373|   171k|	}
  ------------------
  821|       |
  822|   171k|	return 0;
  823|   171k|}
operation.c:vips_operation_get_valist_required:
  827|   161k|{
  828|   161k|	VIPS_DEBUG_MSG("vips_operation_get_valist_required:\n");
  ------------------
  |  |   47|   161k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   161k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   161k|	{ \
  |  |   49|   161k|		; \
  |  |   50|   161k|	} \
  |  |   51|   161k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   161k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  829|       |
  830|       |	/* Extract output arguments. Can't use vips_argument_map here
  831|       |	 * :-( because passing va_list by reference is not portable.
  832|       |	 */
  833|  1.65M|	VIPS_ARGUMENT_FOR_ALL(operation,
  ------------------
  |  |  358|   161k|	{ \
  |  |  359|   161k|		VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(OBJECT); \
  |  |  ------------------
  |  |  |  |  441|   161k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  527|   161k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2310|   161k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  360|   161k|		GSList *p; \
  |  |  361|   161k|\
  |  |  362|  1.81M|		for (p = object_class->argument_table_traverse; p; p = p->next) { \
  |  |  ------------------
  |  |  |  Branch (362:51): [True: 1.65M, False: 161k]
  |  |  ------------------
  |  |  363|  1.65M|			VipsArgumentClass *ARG_CLASS = \
  |  |  364|  1.65M|				(VipsArgumentClass *) p->data; \
  |  |  365|  1.65M|			VipsArgument *argument = (VipsArgument *) argument_class; \
  |  |  366|  1.65M|			GParamSpec *PSPEC = argument->pspec; \
  |  |  367|  1.65M|			VipsArgumentInstance *ARG_INSTANCE G_GNUC_UNUSED = \
  |  |  368|  1.65M|				vips__argument_get_instance(argument_class, \
  |  |  369|  1.65M|					VIPS_OBJECT(OBJECT));
  |  |  ------------------
  |  |  |  |  433|  1.65M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  1.65M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  1.65M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  834|  1.65M|		pspec, argument_class, argument_instance)
  835|  1.65M|	{
  836|  1.65M|		if ((argument_class->flags & VIPS_ARGUMENT_REQUIRED)) {
  ------------------
  |  Branch (836:7): [True: 391k, False: 1.26M]
  ------------------
  837|   467k|			VIPS_ARGUMENT_COLLECT_SET(pspec, argument_class, ap);
  ------------------
  |  |  399|   391k|	if ((ARG_CLASS->flags & VIPS_ARGUMENT_INPUT)) { \
  |  |  ------------------
  |  |  |  Branch (399:6): [True: 233k, False: 157k]
  |  |  ------------------
  |  |  400|   233k|		GValue value = G_VALUE_INIT; \
  |  |  ------------------
  |  |  |  |  191|   233k|#define G_VALUE_INIT  { 0, { { 0 } } }
  |  |  ------------------
  |  |  401|   233k|		gchar *error = NULL; \
  |  |  402|   233k|\
  |  |  403|   233k|		/* Input args are given inline, eg. ("factor", 12.0) \
  |  |  404|   233k|		 * and must be collected. \
  |  |  405|   233k|		 */ \
  |  |  406|   233k|		G_VALUE_COLLECT_INIT(&value, \
  |  |  ------------------
  |  |  |  |   88|   233k|#define G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error)		\
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   89|   233k|G_STMT_START {										\
  |  |  |  |   90|   233k|  GValue *g_vci_val = (value);								\
  |  |  |  |   91|   233k|  guint g_vci_flags = (flags);								\
  |  |  |  |   92|   233k|  GTypeValueTable *g_vci_vtab = g_type_value_table_peek (_value_type);			\
  |  |  |  |   93|   233k|  const gchar *g_vci_collect_format = g_vci_vtab->collect_format;					\
  |  |  |  |   94|   233k|  GTypeCValue g_vci_cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };		\
  |  |  |  |   95|   233k|  guint g_vci_n_values = 0;									\
  |  |  |  |   96|   233k|                                                                                        \
  |  |  |  |   97|   233k|  g_vci_val->g_type = _value_type;		/* value_meminit() from gvalue.c */		\
  |  |  |  |   98|   467k|  while (*g_vci_collect_format)								\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (98:10): [True: 233k, False: 233k]
  |  |  |  |  ------------------
  |  |  |  |   99|   233k|    {											\
  |  |  |  |  100|   233k|      GTypeCValue *g_vci_cvalue = g_vci_cvalues + g_vci_n_values++;					\
  |  |  |  |  101|   233k|                                                                                        \
  |  |  |  |  102|   233k|      switch (*g_vci_collect_format++)							\
  |  |  |  |  103|   233k|	{										\
  |  |  |  |  104|  49.8k|	case G_VALUE_COLLECT_INT:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (104:2): [True: 49.8k, False: 183k]
  |  |  |  |  ------------------
  |  |  |  |  105|  49.8k|	  g_vci_cvalue->v_int = va_arg ((var_args), gint);					\
  |  |  |  |  106|  49.8k|	  break;									\
  |  |  |  |  107|      0|	case G_VALUE_COLLECT_LONG:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:2): [True: 0, False: 233k]
  |  |  |  |  ------------------
  |  |  |  |  108|      0|	  g_vci_cvalue->v_long = va_arg ((var_args), glong);					\
  |  |  |  |  109|      0|	  break;									\
  |  |  |  |  110|      0|	case G_VALUE_COLLECT_INT64:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (110:2): [True: 0, False: 233k]
  |  |  |  |  ------------------
  |  |  |  |  111|      0|	  g_vci_cvalue->v_int64 = va_arg ((var_args), gint64);				\
  |  |  |  |  112|      0|	  break;									\
  |  |  |  |  113|      0|	case G_VALUE_COLLECT_DOUBLE:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (113:2): [True: 0, False: 233k]
  |  |  |  |  ------------------
  |  |  |  |  114|      0|	  g_vci_cvalue->v_double = va_arg ((var_args), gdouble);				\
  |  |  |  |  115|      0|	  break;									\
  |  |  |  |  116|   183k|	case G_VALUE_COLLECT_POINTER:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (116:2): [True: 183k, False: 49.8k]
  |  |  |  |  ------------------
  |  |  |  |  117|   183k|	  g_vci_cvalue->v_pointer = va_arg ((var_args), gpointer);				\
  |  |  |  |  118|   183k|	  break;									\
  |  |  |  |  119|      0|	default:									\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (119:2): [True: 0, False: 233k]
  |  |  |  |  ------------------
  |  |  |  |  120|      0|	  g_assert_not_reached ();							\
  |  |  |  |  ------------------
  |  |  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  121|   233k|	}										\
  |  |  |  |  122|   233k|    }											\
  |  |  |  |  123|   233k|  *(__error) = g_vci_vtab->collect_value (g_vci_val,						\
  |  |  |  |  124|   233k|				       g_vci_n_values,					\
  |  |  |  |  125|   233k|				       g_vci_cvalues,					\
  |  |  |  |  126|   233k|				       g_vci_flags);						\
  |  |  |  |  127|   233k|} G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  407|   233k|			G_PARAM_SPEC_VALUE_TYPE(PSPEC), AP, 0, &error); \
  |  |  408|   233k|\
  |  |  409|   233k|		/* Don't bother with the error message. \
  |  |  410|   233k|		 */ \
  |  |  411|   233k|		if (error) { \
  |  |  ------------------
  |  |  |  Branch (411:7): [True: 0, False: 233k]
  |  |  ------------------
  |  |  412|      0|			VIPS_DEBUG_MSG("VIPS_OBJECT_COLLECT_SET: err\n"); \
  |  |  ------------------
  |  |  |  |   47|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   48|      0|	{ \
  |  |  |  |   49|      0|		; \
  |  |  |  |   50|      0|	} \
  |  |  |  |   51|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  413|      0|			g_free(error); \
  |  |  414|      0|		}
  ------------------
  838|       |
  839|   467k|			VIPS_ARGUMENT_COLLECT_GET(pspec, argument_class, ap);
  ------------------
  |  |  417|   233k|	g_value_unset(&value); \
  |  |  418|   233k|	} \
  |  |  419|   391k|	else if ((ARG_CLASS->flags & VIPS_ARGUMENT_OUTPUT)) \
  |  |  ------------------
  |  |  |  Branch (419:11): [True: 157k, False: 0]
  |  |  ------------------
  |  |  420|   157k|	{ \
  |  |  421|   157k|		void **arg G_GNUC_UNUSED; \
  |  |  422|   157k|\
  |  |  423|   157k|		/* Output args are a pointer to where to send the \
  |  |  424|   157k|		 * result. \
  |  |  425|   157k|		 */ \
  |  |  426|   157k|		arg = va_arg(AP, void **);
  ------------------
  840|       |
  841|   315k|			if (!argument_instance->assigned)
  ------------------
  |  Branch (841:8): [True: 0, False: 157k]
  ------------------
  842|      0|				continue;
  843|       |
  844|       |#ifdef VIPS_DEBUG
  845|       |			printf("\twriting %s to %p\n",
  846|       |				g_param_spec_get_name(pspec), arg);
  847|       |#endif /*VIPS_DEBUG */
  848|       |
  849|       |			/* It'd be nice to be able to test for arg being a
  850|       |			 * valid gobject pointer, since passing in a valid
  851|       |			 * pointer (and having us destroy it) is a common
  852|       |			 * error and a cause of hard-to-find leaks.
  853|       |			 *
  854|       |			 * Unfortunately, G_IS_OBJECT() can't be given an
  855|       |			 * arbitrary pointer for testing -- you're very likely
  856|       |			 * to get coredumps.
  857|       |			 */
  858|       |
  859|   157k|			g_object_get(G_OBJECT(operation),
  ------------------
  |  |   51|   157k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|   157k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   157k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  860|   157k|				g_param_spec_get_name(pspec), arg, NULL);
  861|       |
  862|       |			/* If the pspec is an object, that will up the ref
  863|       |			 * count. We want to hand over the ref, so we have to
  864|       |			 * knock it down again.
  865|       |			 */
  866|   157k|			if (G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|   157k|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|   157k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   157k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   157k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   157k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   157k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 157k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   157k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   157k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 157k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 157k, False: 528]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   157k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   157k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   157k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   157k|  else \
  |  |  |  |  |  | 2321|   157k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   157k|  __r; \
  |  |  |  |  |  | 2323|   157k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 157k, False: 528]
  |  |  ------------------
  ------------------
  867|   157k|				GObject *object;
  868|       |
  869|   157k|				object = *((GObject **) arg);
  870|   157k|				g_object_unref(object);
  871|   157k|			}
  872|       |
  873|   157k|			VIPS_ARGUMENT_COLLECT_END
  ------------------
  |  |  429|   157k|	}
  ------------------
  874|   391k|		}
  875|  1.65M|	}
  876|  1.65M|	VIPS_ARGUMENT_FOR_ALL_END
  ------------------
  |  |  372|  1.65M|	} \
  |  |  373|   161k|	}
  ------------------
  877|       |
  878|   161k|	return 0;
  879|   161k|}
operation.c:vips_operation_get_valist_optional:
  883|   161k|{
  884|   161k|	char *name;
  885|       |
  886|   161k|	VIPS_DEBUG_MSG("vips_operation_get_valist_optional:\n");
  ------------------
  |  |   47|   161k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   161k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   161k|	{ \
  |  |   49|   161k|		; \
  |  |   50|   161k|	} \
  |  |   51|   161k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   161k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  887|       |
  888|   199k|	for (name = va_arg(ap, char *); name; name = va_arg(ap, char *)) {
  ------------------
  |  Branch (888:34): [True: 37.7k, False: 161k]
  ------------------
  889|  37.7k|		GParamSpec *pspec;
  890|  37.7k|		VipsArgumentClass *argument_class;
  891|  37.7k|		VipsArgumentInstance *argument_instance;
  892|       |
  893|  37.7k|		VIPS_DEBUG_MSG("\tname = '%s' (%p)\n", name, name);
  ------------------
  |  |   47|  37.7k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  37.7k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  37.7k|	{ \
  |  |   49|  37.7k|		; \
  |  |   50|  37.7k|	} \
  |  |   51|  37.7k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  37.7k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  894|       |
  895|  37.7k|		if (vips_object_get_argument(VIPS_OBJECT(operation), name,
  ------------------
  |  |  433|  37.7k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  37.7k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  37.7k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (895:7): [True: 0, False: 37.7k]
  ------------------
  896|  37.7k|				&pspec, &argument_class, &argument_instance))
  897|      0|			return -1;
  898|       |
  899|  75.4k|		VIPS_ARGUMENT_COLLECT_SET(pspec, argument_class, ap);
  ------------------
  |  |  399|  37.7k|	if ((ARG_CLASS->flags & VIPS_ARGUMENT_INPUT)) { \
  |  |  ------------------
  |  |  |  Branch (399:6): [True: 37.7k, False: 0]
  |  |  ------------------
  |  |  400|  37.7k|		GValue value = G_VALUE_INIT; \
  |  |  ------------------
  |  |  |  |  191|  37.7k|#define G_VALUE_INIT  { 0, { { 0 } } }
  |  |  ------------------
  |  |  401|  37.7k|		gchar *error = NULL; \
  |  |  402|  37.7k|\
  |  |  403|  37.7k|		/* Input args are given inline, eg. ("factor", 12.0) \
  |  |  404|  37.7k|		 * and must be collected. \
  |  |  405|  37.7k|		 */ \
  |  |  406|  37.7k|		G_VALUE_COLLECT_INIT(&value, \
  |  |  ------------------
  |  |  |  |   88|  37.7k|#define G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error)		\
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  37.7k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   89|  37.7k|G_STMT_START {										\
  |  |  |  |   90|  37.7k|  GValue *g_vci_val = (value);								\
  |  |  |  |   91|  37.7k|  guint g_vci_flags = (flags);								\
  |  |  |  |   92|  37.7k|  GTypeValueTable *g_vci_vtab = g_type_value_table_peek (_value_type);			\
  |  |  |  |   93|  37.7k|  const gchar *g_vci_collect_format = g_vci_vtab->collect_format;					\
  |  |  |  |   94|  37.7k|  GTypeCValue g_vci_cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };		\
  |  |  |  |   95|  37.7k|  guint g_vci_n_values = 0;									\
  |  |  |  |   96|  37.7k|                                                                                        \
  |  |  |  |   97|  37.7k|  g_vci_val->g_type = _value_type;		/* value_meminit() from gvalue.c */		\
  |  |  |  |   98|  75.4k|  while (*g_vci_collect_format)								\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (98:10): [True: 37.7k, False: 37.7k]
  |  |  |  |  ------------------
  |  |  |  |   99|  37.7k|    {											\
  |  |  |  |  100|  37.7k|      GTypeCValue *g_vci_cvalue = g_vci_cvalues + g_vci_n_values++;					\
  |  |  |  |  101|  37.7k|                                                                                        \
  |  |  |  |  102|  37.7k|      switch (*g_vci_collect_format++)							\
  |  |  |  |  103|  37.7k|	{										\
  |  |  |  |  104|  37.1k|	case G_VALUE_COLLECT_INT:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (104:2): [True: 37.1k, False: 528]
  |  |  |  |  ------------------
  |  |  |  |  105|  37.1k|	  g_vci_cvalue->v_int = va_arg ((var_args), gint);					\
  |  |  |  |  106|  37.1k|	  break;									\
  |  |  |  |  107|      0|	case G_VALUE_COLLECT_LONG:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:2): [True: 0, False: 37.7k]
  |  |  |  |  ------------------
  |  |  |  |  108|      0|	  g_vci_cvalue->v_long = va_arg ((var_args), glong);					\
  |  |  |  |  109|      0|	  break;									\
  |  |  |  |  110|      0|	case G_VALUE_COLLECT_INT64:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (110:2): [True: 0, False: 37.7k]
  |  |  |  |  ------------------
  |  |  |  |  111|      0|	  g_vci_cvalue->v_int64 = va_arg ((var_args), gint64);				\
  |  |  |  |  112|      0|	  break;									\
  |  |  |  |  113|      0|	case G_VALUE_COLLECT_DOUBLE:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (113:2): [True: 0, False: 37.7k]
  |  |  |  |  ------------------
  |  |  |  |  114|      0|	  g_vci_cvalue->v_double = va_arg ((var_args), gdouble);				\
  |  |  |  |  115|      0|	  break;									\
  |  |  |  |  116|    528|	case G_VALUE_COLLECT_POINTER:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (116:2): [True: 528, False: 37.1k]
  |  |  |  |  ------------------
  |  |  |  |  117|    528|	  g_vci_cvalue->v_pointer = va_arg ((var_args), gpointer);				\
  |  |  |  |  118|    528|	  break;									\
  |  |  |  |  119|      0|	default:									\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (119:2): [True: 0, False: 37.7k]
  |  |  |  |  ------------------
  |  |  |  |  120|      0|	  g_assert_not_reached ();							\
  |  |  |  |  ------------------
  |  |  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  121|  37.7k|	}										\
  |  |  |  |  122|  37.7k|    }											\
  |  |  |  |  123|  37.7k|  *(__error) = g_vci_vtab->collect_value (g_vci_val,						\
  |  |  |  |  124|  37.7k|				       g_vci_n_values,					\
  |  |  |  |  125|  37.7k|				       g_vci_cvalues,					\
  |  |  |  |  126|  37.7k|				       g_vci_flags);						\
  |  |  |  |  127|  37.7k|} G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  37.7k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  407|  37.7k|			G_PARAM_SPEC_VALUE_TYPE(PSPEC), AP, 0, &error); \
  |  |  408|  37.7k|\
  |  |  409|  37.7k|		/* Don't bother with the error message. \
  |  |  410|  37.7k|		 */ \
  |  |  411|  37.7k|		if (error) { \
  |  |  ------------------
  |  |  |  Branch (411:7): [True: 0, False: 37.7k]
  |  |  ------------------
  |  |  412|      0|			VIPS_DEBUG_MSG("VIPS_OBJECT_COLLECT_SET: err\n"); \
  |  |  ------------------
  |  |  |  |   47|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   48|      0|	{ \
  |  |  |  |   49|      0|		; \
  |  |  |  |   50|      0|	} \
  |  |  |  |   51|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  413|      0|			g_free(error); \
  |  |  414|      0|		}
  ------------------
  900|       |
  901|       |		/* We must collect input args as we walk the name/value list,
  902|       |		 * but we don't do anything with them.
  903|       |		 */
  904|       |
  905|  75.4k|		VIPS_ARGUMENT_COLLECT_GET(pspec, argument_class, ap);
  ------------------
  |  |  417|  37.7k|	g_value_unset(&value); \
  |  |  418|  37.7k|	} \
  |  |  419|  37.7k|	else if ((ARG_CLASS->flags & VIPS_ARGUMENT_OUTPUT)) \
  |  |  ------------------
  |  |  |  Branch (419:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  420|      0|	{ \
  |  |  421|      0|		void **arg G_GNUC_UNUSED; \
  |  |  422|      0|\
  |  |  423|      0|		/* Output args are a pointer to where to send the \
  |  |  424|      0|		 * result. \
  |  |  425|      0|		 */ \
  |  |  426|      0|		arg = va_arg(AP, void **);
  ------------------
  906|       |
  907|       |		/* Here's an output arg.
  908|       |		 */
  909|       |
  910|       |#ifdef VIPS_DEBUG
  911|       |		printf("\twriting %s to %p\n",
  912|       |			g_param_spec_get_name(pspec), arg);
  913|       |#endif /*VIPS_DEBUG */
  914|       |
  915|       |		/* If the dest pointer is NULL, skip the read.
  916|       |		 */
  917|      0|		if (arg) {
  ------------------
  |  Branch (917:7): [True: 0, False: 0]
  ------------------
  918|      0|			g_object_get(G_OBJECT(operation),
  ------------------
  |  |   51|      0|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  919|      0|				g_param_spec_get_name(pspec), arg,
  920|      0|				NULL);
  921|       |
  922|       |			/* If the pspec is an object, that will up
  923|       |			 * the ref count. We want to hand over the
  924|       |			 * ref, so we have to knock it down again.
  925|       |			 */
  926|      0|			if (G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|      0|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|      0|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|      0|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|      0|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|      0|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|      0|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|      0|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|      0|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|      0|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|      0|  else \
  |  |  |  |  |  | 2321|      0|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|      0|  __r; \
  |  |  |  |  |  | 2323|      0|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  927|      0|				GObject *object;
  928|       |
  929|      0|				object = *((GObject **) arg);
  930|      0|				g_object_unref(object);
  931|      0|			}
  932|      0|		}
  933|       |
  934|      0|		VIPS_ARGUMENT_COLLECT_END
  ------------------
  |  |  429|      0|	}
  ------------------
  935|  37.7k|	}
  936|       |
  937|   161k|	return 0;
  938|   161k|}
operation.c:vips_call_by_name:
  995|   171k|{
  996|   171k|	VipsOperation *operation;
  997|   171k|	int result;
  998|       |
  999|   171k|	VIPS_DEBUG_MSG("vips_call_by_name: starting for %s ...\n",
  ------------------
  |  |   47|   171k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   171k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   171k|	{ \
  |  |   49|   171k|		; \
  |  |   50|   171k|	} \
  |  |   51|   171k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   171k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1000|   171k|		operation_name);
 1001|       |
 1002|   171k|	if (!(operation = vips_operation_new(operation_name)))
  ------------------
  |  Branch (1002:6): [True: 0, False: 171k]
  ------------------
 1003|      0|		return -1;
 1004|       |
 1005|       |	/* Set str options before vargs options, so the user can't override
 1006|       |	 * things we set deliberately.
 1007|       |	 */
 1008|   171k|	if (option_string &&
  ------------------
  |  Branch (1008:6): [True: 25.6k, False: 146k]
  ------------------
 1009|   171k|		vips_object_set_from_string(VIPS_OBJECT(operation),
  ------------------
  |  |  433|  25.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  25.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  25.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1009:3): [True: 0, False: 25.6k]
  ------------------
 1010|  25.6k|			option_string)) {
 1011|      0|		vips_object_unref_outputs(VIPS_OBJECT(operation));
  ------------------
  |  |  433|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1012|      0|		g_object_unref(operation);
 1013|       |
 1014|      0|		return -1;
 1015|      0|	}
 1016|       |
 1017|   171k|	result = vips_call_required_optional(&operation, required, optional);
 1018|       |
 1019|       |	/* Build failed: junk args and back out.
 1020|       |	 */
 1021|   171k|	if (result) {
  ------------------
  |  Branch (1021:6): [True: 10.1k, False: 161k]
  ------------------
 1022|  10.1k|		vips_object_unref_outputs(VIPS_OBJECT(operation));
  ------------------
  |  |  433|  10.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  10.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1023|  10.1k|		g_object_unref(operation);
 1024|       |
 1025|  10.1k|		return -1;
 1026|  10.1k|	}
 1027|       |
 1028|       |	/* The operation we have built should now have been reffed by one of
 1029|       |	 * its arguments or have finished its work. Either way, we can unref.
 1030|       |	 */
 1031|   161k|	g_object_unref(operation);
 1032|       |
 1033|   161k|	return result;
 1034|   171k|}

vips_rect_isempty:
   97|  1.00M|{
   98|  1.00M|	return r->width <= 0 || r->height <= 0;
  ------------------
  |  Branch (98:9): [True: 0, False: 1.00M]
  |  Branch (98:26): [True: 0, False: 1.00M]
  ------------------
   99|  1.00M|}
vips_rect_includesrect:
  112|   438k|{
  113|   438k|	return r1->left <= r2->left &&
  ------------------
  |  Branch (113:9): [True: 438k, False: 0]
  ------------------
  114|   438k|		r1->top <= r2->top &&
  ------------------
  |  Branch (114:3): [True: 438k, False: 0]
  ------------------
  115|   438k|		r1->left + r1->width >= r2->left + r2->width &&
  ------------------
  |  Branch (115:3): [True: 438k, False: 0]
  ------------------
  116|   438k|		r1->top + r1->height >= r2->top + r2->height;
  ------------------
  |  Branch (116:3): [True: 403k, False: 34.4k]
  ------------------
  117|   438k|}
vips_rect_intersectrect:
  180|  1.91M|{
  181|  1.91M|	int left = VIPS_MAX(r1->left, r2->left);
  ------------------
  |  |   54|  1.91M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 65.2k, False: 1.84M]
  |  |  ------------------
  ------------------
  182|  1.91M|	int top = VIPS_MAX(r1->top, r2->top);
  ------------------
  |  |   54|  1.91M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 752k, False: 1.15M]
  |  |  ------------------
  ------------------
  183|  1.91M|	int right = VIPS_MIN(VIPS_RECT_RIGHT(r1), VIPS_RECT_RIGHT(r2));
  ------------------
  |  |   55|  1.91M|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 69.9k, False: 1.84M]
  |  |  ------------------
  ------------------
  184|  1.91M|	int bottom = VIPS_MIN(VIPS_RECT_BOTTOM(r1), VIPS_RECT_BOTTOM(r2));
  ------------------
  |  |   55|  1.91M|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 916k, False: 993k]
  |  |  ------------------
  ------------------
  185|  1.91M|	int width = VIPS_MAX(0, right - left);
  ------------------
  |  |   54|  1.91M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 1.91M]
  |  |  ------------------
  ------------------
  186|  1.91M|	int height = VIPS_MAX(0, bottom - top);
  ------------------
  |  |   54|  1.91M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 1.91M]
  |  |  ------------------
  ------------------
  187|       |
  188|  1.91M|	out->left = left;
  189|  1.91M|	out->top = top;
  190|  1.91M|	out->width = width;
  191|  1.91M|	out->height = height;
  192|  1.91M|}

vips__region_start:
  228|   377k|{
  229|   377k|	VipsImage *image = region->im;
  230|       |
  231|   377k|	if (!region->seq && image->start_fn) {
  ------------------
  |  Branch (231:6): [True: 219k, False: 157k]
  |  Branch (231:22): [True: 170k, False: 49.3k]
  ------------------
  232|   170k|		VIPS_GATE_START("vips__region_start: wait");
  ------------------
  |  |   41|   170k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   170k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   170k|	{ \
  |  |   43|   170k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 170k]
  |  |  ------------------
  |  |   44|   170k|			vips__thread_gate_start(NAME); \
  |  |   45|   170k|	} \
  |  |   46|   170k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   170k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  233|       |
  234|   170k|		g_mutex_lock(image->sslock);
  235|       |
  236|   170k|		VIPS_GATE_STOP("vips__region_start: wait");
  ------------------
  |  |   49|   170k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   170k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   170k|	{ \
  |  |   51|   170k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 170k]
  |  |  ------------------
  |  |   52|   170k|			vips__thread_gate_stop(NAME); \
  |  |   53|   170k|	} \
  |  |   54|   170k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   170k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  237|       |
  238|   170k|		region->seq = image->start_fn(image,
  239|   170k|			image->client1, image->client2);
  240|       |
  241|   170k|		g_mutex_unlock(image->sslock);
  242|       |
  243|   170k|		if (!region->seq) {
  ------------------
  |  Branch (243:7): [True: 6.83k, False: 163k]
  ------------------
  244|       |#ifdef DEBUG
  245|       |			printf("vips__region_start: start function failed for image %s",
  246|       |				image->filename);
  247|       |#endif /*DEBUG*/
  248|       |
  249|  6.83k|			return -1;
  250|  6.83k|		}
  251|   170k|	}
  252|       |
  253|   370k|	return 0;
  254|   377k|}
vips__region_stop:
  260|   342k|{
  261|   342k|	VipsImage *image = region->im;
  262|       |
  263|   342k|	if (region->seq && image->stop_fn) {
  ------------------
  |  Branch (263:6): [True: 163k, False: 178k]
  |  Branch (263:21): [True: 163k, False: 0]
  ------------------
  264|   163k|		int result;
  265|       |
  266|   163k|		VIPS_GATE_START("vips__region_stop: wait");
  ------------------
  |  |   41|   163k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   163k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   163k|	{ \
  |  |   43|   163k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 163k]
  |  |  ------------------
  |  |   44|   163k|			vips__thread_gate_start(NAME); \
  |  |   45|   163k|	} \
  |  |   46|   163k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   163k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|       |
  268|   163k|		g_mutex_lock(image->sslock);
  269|       |
  270|   163k|		VIPS_GATE_STOP("vips__region_stop: wait");
  ------------------
  |  |   49|   163k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   163k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   163k|	{ \
  |  |   51|   163k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 163k]
  |  |  ------------------
  |  |   52|   163k|			vips__thread_gate_stop(NAME); \
  |  |   53|   163k|	} \
  |  |   54|   163k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   163k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  271|       |
  272|   163k|		result = image->stop_fn(region->seq,
  273|   163k|			image->client1, image->client2);
  274|       |
  275|   163k|		g_mutex_unlock(image->sslock);
  276|       |
  277|       |		/* stop function can return an error, but we have nothing we
  278|       |		 * can really do with it, sadly.
  279|       |		 */
  280|   163k|		if (result)
  ------------------
  |  Branch (280:7): [True: 0, False: 163k]
  ------------------
  281|      0|			g_warning("stop callback failed for image %s",
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  282|   163k|				image->filename);
  283|       |
  284|   163k|		region->seq = NULL;
  285|   163k|	}
  286|   342k|}
vips__region_take_ownership:
  379|   353k|{
  380|       |	/* Lock so that there's a memory barrier with the thread doing the
  381|       |	 * vips__region_no_ownership() before us.
  382|       |	 */
  383|   353k|	VIPS_GATE_START("vips__region_take_ownership: wait");
  ------------------
  |  |   41|   353k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   353k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   353k|	{ \
  |  |   43|   353k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 353k]
  |  |  ------------------
  |  |   44|   353k|			vips__thread_gate_start(NAME); \
  |  |   45|   353k|	} \
  |  |   46|   353k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   353k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  384|       |
  385|   353k|	g_mutex_lock(region->im->sslock);
  386|       |
  387|   353k|	VIPS_GATE_STOP("vips__region_take_ownership: wait");
  ------------------
  |  |   49|   353k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   353k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   353k|	{ \
  |  |   51|   353k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 353k]
  |  |  ------------------
  |  |   52|   353k|			vips__thread_gate_stop(NAME); \
  |  |   53|   353k|	} \
  |  |   54|   353k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   353k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  388|       |
  389|   353k|	if (region->thread != g_thread_self()) {
  ------------------
  |  Branch (389:6): [True: 353k, False: 0]
  ------------------
  390|   353k|		g_assert(region->thread == NULL);
  ------------------
  |  |  166|   353k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   353k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   353k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  391|       |
  392|       |		/* We don't want to move shared buffers: the other region
  393|       |		 * using this buffer will still be on the other thread.
  394|       |		 * Not sure if this will ever happen: if it does, we'll
  395|       |		 * need to dup the buffer.
  396|       |		 */
  397|   353k|		g_assert(!region->buffer ||
  ------------------
  |  |  166|   353k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   353k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   353k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  398|   353k|			region->buffer->ref_count == 1);
  399|       |
  400|   353k|		region->thread = g_thread_self();
  401|   353k|	}
  402|       |
  403|   353k|	g_mutex_unlock(region->im->sslock);
  404|   353k|}
vips__region_check_ownership:
  408|  1.15M|{
  409|  1.15M|	if (region->thread) {
  ------------------
  |  Branch (409:6): [True: 1.04M, False: 107k]
  ------------------
  410|  1.04M|		g_assert(region->thread == g_thread_self());
  ------------------
  |  |  166|  1.04M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.04M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.04M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  411|  1.04M|		if (region->buffer && region->buffer->cache)
  ------------------
  |  Branch (411:7): [True: 227k, False: 818k]
  |  Branch (411:25): [True: 68.8k, False: 158k]
  ------------------
  412|  1.04M|			g_assert(region->thread ==
  ------------------
  |  |  166|  68.8k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  68.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  68.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  413|  1.04M|				region->buffer->cache->thread);
  414|  1.04M|	}
  415|  1.15M|}
vips__region_no_ownership:
  422|   139k|{
  423|   139k|	VIPS_GATE_START("vips__region_no_ownership: wait");
  ------------------
  |  |   41|   139k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   139k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   139k|	{ \
  |  |   43|   139k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 139k]
  |  |  ------------------
  |  |   44|   139k|			vips__thread_gate_start(NAME); \
  |  |   45|   139k|	} \
  |  |   46|   139k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   139k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  424|       |
  425|   139k|	g_mutex_lock(region->im->sslock);
  426|       |
  427|   139k|	VIPS_GATE_STOP("vips__region_no_ownership: wait");
  ------------------
  |  |   49|   139k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   139k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   139k|	{ \
  |  |   51|   139k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 139k]
  |  |  ------------------
  |  |   52|   139k|			vips__thread_gate_stop(NAME); \
  |  |   53|   139k|	} \
  |  |   54|   139k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   139k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  428|       |
  429|   139k|	vips__region_check_ownership(region);
  430|       |
  431|   139k|	region->thread = NULL;
  432|   139k|	if (region->buffer)
  ------------------
  |  Branch (432:6): [True: 10.9k, False: 128k]
  ------------------
  433|  10.9k|		vips_buffer_undone(region->buffer);
  434|       |
  435|   139k|	g_mutex_unlock(region->im->sslock);
  436|   139k|}
vips_region_new:
  505|   342k|{
  506|   342k|	VipsRegion *region;
  507|       |
  508|       |	/* Ref quickly, we want to make sure we keep the image around.
  509|       |	 * We can't use the property system, we need to be very threaded.
  510|       |	 */
  511|   342k|	g_object_ref(image);
  512|   342k|	g_assert(G_OBJECT(image)->ref_count > 1);
  ------------------
  |  |  166|   342k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   342k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   342k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  513|   342k|	g_assert(vips_object_sanity(VIPS_OBJECT(image)));
  ------------------
  |  |  166|   342k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   342k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   342k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  514|       |
  515|   342k|	region = VIPS_REGION(g_object_new(VIPS_TYPE_REGION, NULL));
  ------------------
  |  |   52|   342k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   342k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   342k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|   342k|		VIPS_TYPE_REGION, VipsRegion))
  ------------------
  516|   342k|	region->im = image;
  517|       |
  518|   342k|	if (vips_object_build(VIPS_OBJECT(region))) {
  ------------------
  |  |  433|   342k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   342k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   342k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (518:6): [True: 0, False: 342k]
  ------------------
  519|      0|		VIPS_UNREF(region);
  ------------------
  |  |   57|      0|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|      0|		return NULL;
  521|      0|	}
  522|       |
  523|   342k|	g_assert(vips_object_sanity(VIPS_OBJECT(region)));
  ------------------
  |  |  166|   342k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   342k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   342k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  524|       |
  525|   342k|	return region;
  526|   342k|}
vips_region_buffer:
  545|   388k|{
  546|   388k|	VipsImage *im = reg->im;
  547|       |
  548|   388k|	VipsRect image;
  549|   388k|	VipsRect clipped;
  550|       |
  551|   388k|	vips__region_check_ownership(reg);
  552|       |
  553|       |	/* Clip against image.
  554|       |	 */
  555|   388k|	image.top = 0;
  556|   388k|	image.left = 0;
  557|   388k|	image.width = im->Xsize;
  558|   388k|	image.height = im->Ysize;
  559|   388k|	vips_rect_intersectrect(r, &image, &clipped);
  560|       |
  561|       |	/* Test for empty.
  562|       |	 */
  563|   388k|	if (vips_rect_isempty(&clipped)) {
  ------------------
  |  Branch (563:6): [True: 0, False: 388k]
  ------------------
  564|      0|		vips_error("VipsRegion",
  565|      0|			"%s", _("valid clipped to nothing"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  566|      0|		return -1;
  567|      0|	}
  568|       |
  569|   388k|	VIPS_FREEF(vips_window_unref, reg->window);
  ------------------
  |  |   41|   388k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   388k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   388k|	{ \
  |  |   43|   388k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 388k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|   388k|	} \
  |  |   48|   388k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   388k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  570|       |
  571|       |	/* Have we been asked to drop caches? We want to throw everything
  572|       |	 * away.
  573|       |	 *
  574|       |	 * If not, try to reuse the current buffer.
  575|       |	 */
  576|   388k|	if (reg->invalid) {
  ------------------
  |  Branch (576:6): [True: 0, False: 388k]
  ------------------
  577|      0|		VIPS_FREEF(vips_buffer_unref, reg->buffer);
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|      0|	} \
  |  |   48|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  578|      0|		reg->invalid = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  579|       |
  580|      0|		if (!(reg->buffer = vips_buffer_new(im, &clipped)))
  ------------------
  |  Branch (580:7): [True: 0, False: 0]
  ------------------
  581|      0|			return -1;
  582|      0|	}
  583|   388k|	else {
  584|       |		/* We combine buffer unref and new buffer ref in one call
  585|       |		 * to reduce malloc/free cycling.
  586|       |		 */
  587|   388k|		if (!(reg->buffer =
  ------------------
  |  Branch (587:7): [True: 0, False: 388k]
  ------------------
  588|   388k|					vips_buffer_unref_ref(reg->buffer, im, &clipped)))
  589|      0|			return -1;
  590|   388k|	}
  591|       |
  592|       |	/* Init new stuff.
  593|       |	 */
  594|   388k|	reg->valid = reg->buffer->area;
  595|   388k|	reg->bpl = VIPS_IMAGE_SIZEOF_PEL(im) * reg->buffer->area.width;
  ------------------
  |  |  384|   388k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   388k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  596|   388k|	reg->type = VIPS_REGION_BUFFER;
  597|   388k|	reg->data = reg->buffer->buf;
  598|       |
  599|   388k|	return 0;
  600|   388k|}
vips_region_image:
  615|  38.5k|{
  616|  38.5k|	VipsImage *image = reg->im;
  617|       |
  618|  38.5k|	VipsRect all;
  619|  38.5k|	VipsRect clipped;
  620|       |
  621|       |	/* Sanity check.
  622|       |	 */
  623|  38.5k|	vips__region_check_ownership(reg);
  624|       |
  625|       |	/* Clip against image.
  626|       |	 */
  627|  38.5k|	all.top = 0;
  628|  38.5k|	all.left = 0;
  629|  38.5k|	all.width = image->Xsize;
  630|  38.5k|	all.height = image->Ysize;
  631|  38.5k|	vips_rect_intersectrect(r, &all, &clipped);
  632|       |
  633|  38.5k|	if (vips_rect_isempty(&clipped)) {
  ------------------
  |  Branch (633:6): [True: 0, False: 38.5k]
  ------------------
  634|      0|		vips_error("VipsRegion",
  635|      0|			"%s", _("valid clipped to nothing"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  636|      0|		return -1;
  637|      0|	}
  638|       |
  639|  38.5k|	reg->invalid = FALSE;
  ------------------
  |  |  794|  38.5k|#define	FALSE	(0)
  ------------------
  640|  38.5k|	VIPS_FREEF(vips_buffer_unref, reg->buffer);
  ------------------
  |  |   41|  38.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  38.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  38.5k|	{ \
  |  |   43|  38.5k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 38.5k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  38.5k|	} \
  |  |   48|  38.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  38.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  641|       |
  642|  38.5k|	if (image->data) {
  ------------------
  |  Branch (642:6): [True: 38.5k, False: 0]
  ------------------
  643|       |		/* We have the whole image available ... easy!
  644|       |		 */
  645|  38.5k|		VIPS_FREEF(vips_window_unref, reg->window);
  ------------------
  |  |   41|  38.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  38.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  38.5k|	{ \
  |  |   43|  38.5k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 38.5k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  38.5k|	} \
  |  |   48|  38.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  38.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  646|       |
  647|       |		/* We can't just set valid = whole image, since this may be an
  648|       |		 * incompletely calculated memory buffer. Just set valid to r.
  649|       |		 */
  650|  38.5k|		reg->valid = clipped;
  651|  38.5k|		reg->bpl = VIPS_IMAGE_SIZEOF_LINE(image);
  ------------------
  |  |  386|  38.5k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|  38.5k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  38.5k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  652|  38.5k|		reg->data = VIPS_IMAGE_ADDR(image, clipped.left, clipped.top);
  ------------------
  |  |  418|  38.5k|	((I)->data + \
  |  |  419|  38.5k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|  38.5k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  38.5k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  38.5k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|  38.5k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|  38.5k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  38.5k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  653|  38.5k|		reg->type = VIPS_REGION_OTHER_IMAGE;
  654|  38.5k|	}
  655|      0|	else if (image->dtype == VIPS_IMAGE_OPENIN) {
  ------------------
  |  Branch (655:11): [True: 0, False: 0]
  ------------------
  656|       |		/* No complete image data ... but we can use a rolling window.
  657|       |		 */
  658|      0|		reg->type = VIPS_REGION_WINDOW;
  659|      0|		if (!(reg->window = vips_window_take(reg->window, image,
  ------------------
  |  Branch (659:7): [True: 0, False: 0]
  ------------------
  660|      0|				  clipped.top, clipped.height)))
  661|      0|			return -1;
  662|       |
  663|       |		/* Note the area the window actually represents.
  664|       |		 */
  665|      0|		reg->valid.left = 0;
  666|      0|		reg->valid.top = reg->window->top;
  667|      0|		reg->valid.width = image->Xsize;
  668|      0|		reg->valid.height = reg->window->height;
  669|      0|		reg->bpl = VIPS_IMAGE_SIZEOF_LINE(image);
  ------------------
  |  |  386|      0|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|      0|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|      0|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  670|      0|		reg->data = reg->window->data;
  671|      0|	}
  672|      0|	else {
  673|      0|		VIPS_FREEF(vips_window_unref, reg->window);
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|      0|	} \
  |  |   48|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  674|       |
  675|      0|		vips_error("VipsRegion", "%s", _("bad image type"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  676|      0|		return -1;
  677|      0|	}
  678|       |
  679|  38.5k|	return 0;
  680|  38.5k|}
vips_region_region:
  708|   293k|{
  709|   293k|	VipsRect image;
  710|   293k|	VipsRect wanted;
  711|   293k|	VipsRect clipped;
  712|   293k|	VipsRect clipped2;
  713|   293k|	VipsRect final;
  714|       |
  715|       |	/* Sanity check.
  716|       |	 */
  717|   293k|	if (!dest->data) {
  ------------------
  |  Branch (717:6): [True: 0, False: 293k]
  ------------------
  718|      0|		vips_error("VipsRegion",
  719|      0|			"%s", _("no pixel data on attached image"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  720|      0|		return -1;
  721|      0|	}
  722|   293k|	if (VIPS_IMAGE_SIZEOF_PEL(dest->im) !=
  ------------------
  |  |  384|   293k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   293k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  |  Branch (722:6): [True: 0, False: 293k]
  ------------------
  723|   293k|		VIPS_IMAGE_SIZEOF_PEL(reg->im)) {
  ------------------
  |  |  384|   293k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   293k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  724|      0|		vips_error("VipsRegion",
  725|      0|			"%s", _("images do not match in pixel size"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  726|      0|		return -1;
  727|      0|	}
  728|   293k|	vips__region_check_ownership(reg);
  729|       |
  730|       |	/* We can't test
  731|       |
  732|       |		g_assert(dest->thread == g_thread_self());
  733|       |
  734|       |	 * since we can have several threads writing to the same region in
  735|       |	 * threadgroup.
  736|       |	 */
  737|       |
  738|       |	/* Clip r against size of the image.
  739|       |	 */
  740|   293k|	image.top = 0;
  741|   293k|	image.left = 0;
  742|   293k|	image.width = reg->im->Xsize;
  743|   293k|	image.height = reg->im->Ysize;
  744|   293k|	vips_rect_intersectrect(r, &image, &clipped);
  745|       |
  746|       |	/* Translate to dest's coordinate space and clip against the available
  747|       |	 * pixels.
  748|       |	 */
  749|   293k|	wanted.left = x + (clipped.left - r->left);
  750|   293k|	wanted.top = y + (clipped.top - r->top);
  751|   293k|	wanted.width = clipped.width;
  752|   293k|	wanted.height = clipped.height;
  753|       |
  754|       |	/* Test that dest->valid is large enough.
  755|       |	 */
  756|   293k|	if (!vips_rect_includesrect(&dest->valid, &wanted)) {
  ------------------
  |  Branch (756:6): [True: 0, False: 293k]
  ------------------
  757|      0|		vips_error("VipsRegion",
  758|      0|			"%s", _("dest too small"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  759|      0|		return -1;
  760|      0|	}
  761|       |
  762|       |	/* Clip against the available pixels.
  763|       |	 */
  764|   293k|	vips_rect_intersectrect(&wanted, &dest->valid, &clipped2);
  765|       |
  766|       |	/* Translate back to reg's coordinate space and set as valid.
  767|       |	 */
  768|   293k|	final.left = r->left + (clipped2.left - wanted.left);
  769|   293k|	final.top = r->top + (clipped2.top - wanted.top);
  770|   293k|	final.width = clipped2.width;
  771|   293k|	final.height = clipped2.height;
  772|       |
  773|       |	/* Test for empty.
  774|       |	 */
  775|   293k|	if (vips_rect_isempty(&final)) {
  ------------------
  |  Branch (775:6): [True: 0, False: 293k]
  ------------------
  776|      0|		vips_error("VipsRegion",
  777|      0|			"%s", _("valid clipped to nothing"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  778|      0|		return -1;
  779|      0|	}
  780|       |
  781|       |	/* Init new stuff.
  782|       |	 */
  783|   293k|	VIPS_FREEF(vips_buffer_unref, reg->buffer);
  ------------------
  |  |   41|   293k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   293k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   293k|	{ \
  |  |   43|   293k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 147k, False: 146k]
  |  |  ------------------
  |  |   44|   147k|			(void) F((S)); \
  |  |   45|   147k|			(S) = 0; \
  |  |   46|   147k|		} \
  |  |   47|   293k|	} \
  |  |   48|   293k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   293k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  784|   293k|	VIPS_FREEF(vips_window_unref, reg->window);
  ------------------
  |  |   41|   293k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   293k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   293k|	{ \
  |  |   43|   293k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 293k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|   293k|	} \
  |  |   48|   293k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   293k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  785|   293k|	reg->invalid = FALSE;
  ------------------
  |  |  794|   293k|#define	FALSE	(0)
  ------------------
  786|   293k|	reg->valid = final;
  787|   293k|	reg->bpl = dest->bpl;
  788|   293k|	reg->data = VIPS_REGION_ADDR(dest, clipped2.left, clipped2.top);
  ------------------
  |  |  227|   293k|	((R)->data + \
  |  |  228|   293k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   293k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   293k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   293k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   293k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   293k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  789|   293k|	reg->type = VIPS_REGION_OTHER_REGION;
  790|       |
  791|   293k|	return 0;
  792|   293k|}
vips_region_fill:
  860|   270k|{
  861|   270k|	g_assert(reg->im->dtype == VIPS_IMAGE_PARTIAL);
  ------------------
  |  |  166|   270k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   270k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   270k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  862|   270k|	g_assert(reg->im->generate_fn);
  ------------------
  |  |  166|   270k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   270k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   270k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  863|       |
  864|       |	/* You'd think we could check reg and see if it already has some of
  865|       |	 * the pixels we need. If it does, we could copy them and only
  866|       |	 * generate the new ones.
  867|       |	 *
  868|       |	 * However, we usually have neighbouring regions on different threads,
  869|       |	 * so from the point of view of this thread, we will get no overlaps
  870|       |	 * on successive prepare requests.
  871|       |	 */
  872|       |
  873|       |	/* Should have local memory.
  874|       |	 */
  875|   270k|	if (vips_region_buffer(reg, r))
  ------------------
  |  Branch (875:6): [True: 0, False: 270k]
  ------------------
  876|      0|		return -1;
  877|       |
  878|       |	/* Evaluate into out_region, if we've not got calculated pixels.
  879|       |	 */
  880|   270k|	if (!reg->buffer->done) {
  ------------------
  |  Branch (880:6): [True: 267k, False: 2.95k]
  ------------------
  881|   267k|		if (fn(reg, a))
  ------------------
  |  Branch (881:7): [True: 47.0k, False: 220k]
  ------------------
  882|  47.0k|			return -1;
  883|       |
  884|       |		/* Publish our results.
  885|       |		 */
  886|   220k|		if (reg->buffer)
  ------------------
  |  Branch (886:7): [True: 73.4k, False: 147k]
  ------------------
  887|  73.4k|			vips_buffer_done(reg->buffer);
  888|   220k|	}
  889|       |
  890|   223k|	return 0;
  891|   270k|}
vips_region_paint:
  923|  60.2k|{
  924|  60.2k|	VipsRect clipped;
  925|       |
  926|  60.2k|	vips_rect_intersectrect(r, &reg->valid, &clipped);
  927|  60.2k|	if (!vips_rect_isempty(&clipped)) {
  ------------------
  |  Branch (927:6): [True: 60.2k, False: 0]
  ------------------
  928|  60.2k|		VipsPel *q = VIPS_REGION_ADDR(reg, clipped.left, clipped.top);
  ------------------
  |  |  227|  60.2k|	((R)->data + \
  |  |  228|  60.2k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  60.2k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  60.2k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  60.2k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  60.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  60.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  929|  60.2k|		size_t ls = VIPS_REGION_LSKIP(reg);
  ------------------
  |  |  195|  60.2k|	((size_t) ((R)->bpl))
  ------------------
  930|  60.2k|		size_t wd = clipped.width * VIPS_IMAGE_SIZEOF_PEL(reg->im);
  ------------------
  |  |  384|  60.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  60.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  931|  60.2k|		int y;
  932|       |
  933|  60.2k|		if (vips_band_format_isint(reg->im->BandFmt)) {
  ------------------
  |  Branch (933:7): [True: 60.2k, False: 0]
  ------------------
  934|   163k|			for (y = 0; y < clipped.height; y++) {
  ------------------
  |  Branch (934:16): [True: 102k, False: 60.2k]
  ------------------
  935|   102k|				memset((char *) q, value, wd);
  936|   102k|				q += ls;
  937|   102k|			}
  938|  60.2k|		}
  939|      0|		else {
  940|      0|			gboolean iscomplex =
  941|      0|				vips_band_format_iscomplex(reg->im->BandFmt);
  942|      0|			int nele = clipped.width * reg->im->Bands *
  943|      0|				(iscomplex ? 2 : 1);
  ------------------
  |  Branch (943:6): [True: 0, False: 0]
  ------------------
  944|      0|			VipsPel *q1;
  945|       |
  946|      0|			switch (reg->im->BandFmt) {
  947|      0|			case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (947:4): [True: 0, False: 0]
  ------------------
  948|      0|			case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (948:4): [True: 0, False: 0]
  ------------------
  949|      0|				FILL_LINE(float, q, nele, value);
  ------------------
  |  |  894|      0|	{ \
  |  |  895|      0|		int x; \
  |  |  896|      0|		TYPE *QT = (TYPE *) Q; \
  |  |  897|      0|\
  |  |  898|      0|		for (x = 0; x < (N); x++) \
  |  |  ------------------
  |  |  |  Branch (898:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  899|      0|			QT[x] = (V); \
  |  |  900|      0|	}
  ------------------
  950|      0|				break;
  951|       |
  952|      0|			case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (952:4): [True: 0, False: 0]
  ------------------
  953|      0|			case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (953:4): [True: 0, False: 0]
  ------------------
  954|      0|				FILL_LINE(double, q, nele, value);
  ------------------
  |  |  894|      0|	{ \
  |  |  895|      0|		int x; \
  |  |  896|      0|		TYPE *QT = (TYPE *) Q; \
  |  |  897|      0|\
  |  |  898|      0|		for (x = 0; x < (N); x++) \
  |  |  ------------------
  |  |  |  Branch (898:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  899|      0|			QT[x] = (V); \
  |  |  900|      0|	}
  ------------------
  955|      0|				break;
  956|       |
  957|      0|			default:
  ------------------
  |  Branch (957:4): [True: 0, False: 0]
  ------------------
  958|      0|				g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  959|      0|			}
  960|       |
  961|      0|			q1 = q + ls;
  962|       |
  963|      0|			for (y = 1; y < clipped.height; y++) {
  ------------------
  |  Branch (963:16): [True: 0, False: 0]
  ------------------
  964|      0|				memcpy((char *) q1, (char *) q, wd);
  965|      0|				q1 += ls;
  966|      0|			}
  967|      0|		}
  968|  60.2k|	}
  969|  60.2k|}
vips_region_black:
 1032|  60.2k|{
 1033|  60.2k|	vips_region_paint(reg, &reg->valid, 0);
 1034|  60.2k|}
vips_region_copy:
 1053|   146k|{
 1054|   146k|	size_t len = VIPS_IMAGE_SIZEOF_PEL(reg->im) * r->width;
  ------------------
  |  |  384|   146k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   146k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
 1055|   146k|	VipsPel *p = VIPS_REGION_ADDR(reg, r->left, r->top);
  ------------------
  |  |  227|   146k|	((R)->data + \
  |  |  228|   146k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   146k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   146k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   146k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   146k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   146k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1056|   146k|	VipsPel *q = VIPS_REGION_ADDR(dest, x, y);
  ------------------
  |  |  227|   146k|	((R)->data + \
  |  |  228|   146k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   146k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   146k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   146k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   146k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   146k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1057|   146k|	size_t plsk = VIPS_REGION_LSKIP(reg);
  ------------------
  |  |  195|   146k|	((size_t) ((R)->bpl))
  ------------------
 1058|   146k|	size_t qlsk = VIPS_REGION_LSKIP(dest);
  ------------------
  |  |  195|   146k|	((size_t) ((R)->bpl))
  ------------------
 1059|       |
 1060|   146k|	int z;
 1061|       |
 1062|       |#ifdef DEBUG
 1063|       |	/* Find the area we will write to in dest.
 1064|       |	 */
 1065|       |	VipsRect output;
 1066|       |
 1067|       |	printf("vips_region_copy: sanity check\n");
 1068|       |
 1069|       |	output.left = x;
 1070|       |	output.top = y;
 1071|       |	output.width = r->width;
 1072|       |	output.height = r->height;
 1073|       |
 1074|       |	/* Must be inside dest->valid.
 1075|       |	 */
 1076|       |	g_assert(vips_rect_includesrect(&dest->valid, &output));
 1077|       |
 1078|       |	/* Check the area we are reading from in reg.
 1079|       |	 */
 1080|       |	g_assert(vips_rect_includesrect(&reg->valid, r));
 1081|       |
 1082|       |	/* VipsPel size must be the same.
 1083|       |	 */
 1084|       |	g_assert(VIPS_IMAGE_SIZEOF_PEL(reg->im) ==
 1085|       |		VIPS_IMAGE_SIZEOF_PEL(dest->im));
 1086|       |#endif /*DEBUG*/
 1087|       |
 1088|       |	/* Copy the scanlines.
 1089|       |	 *
 1090|       |	 * Special case: if the two sets of scanlines are end-to-end (this
 1091|       |	 * happens if we are copying complete regions) we can do a single
 1092|       |	 * memcpy() for the whole thing. This is a little faster since we
 1093|       |	 * won't have to do unaligned copies.
 1094|       |	 */
 1095|   146k|	if (len == plsk &&
  ------------------
  |  Branch (1095:6): [True: 146k, False: 0]
  ------------------
 1096|   146k|		len == qlsk)
  ------------------
  |  Branch (1096:3): [True: 126k, False: 19.9k]
  ------------------
 1097|   126k|		memcpy(q, p, len * r->height);
 1098|  19.9k|	else
 1099|   332k|		for (z = 0; z < r->height; z++) {
  ------------------
  |  Branch (1099:15): [True: 312k, False: 19.9k]
  ------------------
 1100|   312k|			memcpy(q, p, len);
 1101|       |
 1102|   312k|			p += plsk;
 1103|   312k|			q += qlsk;
 1104|   312k|		}
 1105|   146k|}
vips_region_prepare:
 1657|   291k|{
 1658|   291k|	VipsImage *im = reg->im;
 1659|       |
 1660|   291k|	VipsRect save = *r;
 1661|       |
 1662|   291k|	vips__region_check_ownership(reg);
 1663|       |
 1664|   291k|	if (vips_image_iskilled(im))
  ------------------
  |  Branch (1664:6): [True: 0, False: 291k]
  ------------------
 1665|      0|		return -1;
 1666|       |
 1667|       |	/* We use save for sanity checking valid: we test at the end that the
 1668|       |	 * pixels we have generated are indeed all the ones that were asked
 1669|       |	 * for.
 1670|       |	 *
 1671|       |	 * However, r may be clipped by the image size, so we need to clip
 1672|       |	 * save as well to make sure we don't fail the assert due to that.
 1673|       |	 */
 1674|   291k|	{
 1675|   291k|		VipsRect image;
 1676|       |
 1677|   291k|		image.left = 0;
 1678|   291k|		image.top = 0;
 1679|   291k|		image.width = reg->im->Xsize;
 1680|   291k|		image.height = reg->im->Ysize;
 1681|   291k|		vips_rect_intersectrect(&save, &image, &save);
 1682|   291k|	}
 1683|       |
 1684|       |#ifdef DEBUG
 1685|       |	printf("vips_region_prepare: "
 1686|       |		   "left = %d, top = %d, width = %d, height = %d\n",
 1687|       |		r->left, r->top, r->width, r->height);
 1688|       |#endif /*DEBUG*/
 1689|       |
 1690|   291k|	switch (im->dtype) {
 1691|   270k|	case VIPS_IMAGE_PARTIAL:
  ------------------
  |  Branch (1691:2): [True: 270k, False: 21.0k]
  ------------------
 1692|   270k|		if (vips_region_fill(reg, r, vips_region_generate, NULL))
  ------------------
  |  Branch (1692:7): [True: 47.0k, False: 223k]
  ------------------
 1693|  47.0k|			return -1;
 1694|       |
 1695|   223k|		break;
 1696|       |
 1697|   223k|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (1697:2): [True: 21.0k, False: 270k]
  ------------------
 1698|  21.0k|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (1698:2): [True: 0, False: 291k]
  ------------------
 1699|  21.0k|	case VIPS_IMAGE_MMAPIN:
  ------------------
  |  Branch (1699:2): [True: 0, False: 291k]
  ------------------
 1700|  21.0k|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (1700:2): [True: 0, False: 291k]
  ------------------
 1701|  21.0k|	case VIPS_IMAGE_OPENIN:
  ------------------
  |  Branch (1701:2): [True: 0, False: 291k]
  ------------------
 1702|       |		/* Attach to existing buffer.
 1703|       |		 */
 1704|  21.0k|		if (vips_region_image(reg, r))
  ------------------
  |  Branch (1704:7): [True: 0, False: 21.0k]
  ------------------
 1705|      0|			return -1;
 1706|       |
 1707|  21.0k|		break;
 1708|       |
 1709|  21.0k|	default:
  ------------------
  |  Branch (1709:2): [True: 0, False: 291k]
  ------------------
 1710|      0|		vips_error("vips_region_prepare",
 1711|      0|			_("unable to input from a %s image"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1712|      0|			vips_enum_string(VIPS_TYPE_DEMAND_STYLE, im->dtype));
  ------------------
  |  |  136|      0|#define VIPS_TYPE_DEMAND_STYLE (vips_demand_style_get_type())
  ------------------
 1713|      0|		return -1;
 1714|   291k|	}
 1715|       |
 1716|       |	/* valid should now include all the pixels that were asked for.
 1717|       |	 */
 1718|   291k|	g_assert(vips_rect_includesrect(&reg->valid, &save));
  ------------------
  |  |  166|   291k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   244k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   291k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1719|       |
 1720|   244k|	return 0;
 1721|   291k|}
vips_region_prepare_to:
 1787|   109k|{
 1788|   109k|	VipsImage *im = reg->im;
 1789|   109k|	VipsRect image;
 1790|   109k|	VipsRect wanted;
 1791|   109k|	VipsRect clipped;
 1792|   109k|	VipsRect clipped2;
 1793|   109k|	VipsRect final;
 1794|       |
 1795|   109k|	if (vips_image_iskilled(im))
  ------------------
  |  Branch (1795:6): [True: 0, False: 109k]
  ------------------
 1796|      0|		return -1;
 1797|       |
 1798|       |	/* Sanity check.
 1799|       |	 */
 1800|   109k|	if (!dest->data ||
  ------------------
  |  Branch (1800:6): [True: 0, False: 109k]
  ------------------
 1801|   109k|		dest->im->BandFmt != reg->im->BandFmt ||
  ------------------
  |  Branch (1801:3): [True: 0, False: 109k]
  ------------------
 1802|   109k|		dest->im->Bands != reg->im->Bands) {
  ------------------
  |  Branch (1802:3): [True: 0, False: 109k]
  ------------------
 1803|      0|		vips_error("vips_region_prepare_to",
 1804|      0|			"%s", _("inappropriate region type"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1805|      0|		return -1;
 1806|      0|	}
 1807|       |
 1808|       |	/* clip r first against the size of reg->im, then again against the
 1809|       |	 * memory we have available to write to on dest. Just like
 1810|       |	 * vips_region_region()
 1811|       |	 */
 1812|   109k|	image.top = 0;
 1813|   109k|	image.left = 0;
 1814|   109k|	image.width = reg->im->Xsize;
 1815|   109k|	image.height = reg->im->Ysize;
 1816|   109k|	vips_rect_intersectrect(r, &image, &clipped);
 1817|       |
 1818|   109k|	g_assert(clipped.left == r->left);
  ------------------
  |  |  166|   109k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   109k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   109k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1819|   109k|	g_assert(clipped.top == r->top);
  ------------------
  |  |  166|   109k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   109k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   109k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1820|       |
 1821|   109k|	wanted.left = x + (clipped.left - r->left);
 1822|   109k|	wanted.top = y + (clipped.top - r->top);
 1823|   109k|	wanted.width = clipped.width;
 1824|   109k|	wanted.height = clipped.height;
 1825|       |
 1826|       |	/* Test that dest->valid is large enough.
 1827|       |	 */
 1828|   109k|	if (!vips_rect_includesrect(&dest->valid, &wanted)) {
  ------------------
  |  Branch (1828:6): [True: 0, False: 109k]
  ------------------
 1829|      0|		vips_error("vips_region_prepare_to",
 1830|      0|			"%s", _("dest too small"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1831|      0|		return -1;
 1832|      0|	}
 1833|       |
 1834|   109k|	vips_rect_intersectrect(&wanted, &dest->valid, &clipped2);
 1835|       |
 1836|       |	/* Translate back to reg's coordinate space and set as valid.
 1837|       |	 */
 1838|   109k|	final.left = r->left + (clipped2.left - wanted.left);
 1839|   109k|	final.top = r->top + (clipped2.top - wanted.top);
 1840|   109k|	final.width = clipped2.width;
 1841|   109k|	final.height = clipped2.height;
 1842|       |
 1843|   109k|	x = clipped2.left;
 1844|   109k|	y = clipped2.top;
 1845|       |
 1846|   109k|	if (vips_rect_isempty(&final)) {
  ------------------
  |  Branch (1846:6): [True: 0, False: 109k]
  ------------------
 1847|      0|		vips_error("vips_region_prepare_to",
 1848|      0|			"%s", _("valid clipped to nothing"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1849|      0|		return -1;
 1850|      0|	}
 1851|       |
 1852|       |#ifdef DEBUG
 1853|       |	printf("vips_region_prepare_to: "
 1854|       |		   "left = %d, top = %d, width = %d, height = %d\n",
 1855|       |		final.left, final.top, final.width, final.height);
 1856|       |#endif /*DEBUG*/
 1857|       |
 1858|       |	/* Input or output image type?
 1859|       |	 */
 1860|   109k|	switch (im->dtype) {
 1861|      0|	case VIPS_IMAGE_OPENOUT:
  ------------------
  |  Branch (1861:2): [True: 0, False: 109k]
  ------------------
 1862|  82.0k|	case VIPS_IMAGE_PARTIAL:
  ------------------
  |  Branch (1862:2): [True: 82.0k, False: 27.8k]
  ------------------
 1863|       |		/* We are generating with a sequence.
 1864|       |		 */
 1865|  82.0k|		if (vips_region_prepare_to_generate(reg, dest, &final, x, y))
  ------------------
  |  Branch (1865:7): [True: 12.4k, False: 69.5k]
  ------------------
 1866|  12.4k|			return -1;
 1867|       |
 1868|  69.5k|		break;
 1869|       |
 1870|  69.5k|	case VIPS_IMAGE_MMAPIN:
  ------------------
  |  Branch (1870:2): [True: 0, False: 109k]
  ------------------
 1871|      0|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (1871:2): [True: 0, False: 109k]
  ------------------
 1872|      0|	case VIPS_IMAGE_OPENIN:
  ------------------
  |  Branch (1872:2): [True: 0, False: 109k]
  ------------------
 1873|       |		/* Attach to existing buffer and copy to dest.
 1874|       |		 */
 1875|      0|		if (vips_region_image(reg, &final))
  ------------------
  |  Branch (1875:7): [True: 0, False: 0]
  ------------------
 1876|      0|			return -1;
 1877|      0|		vips_region_copy(reg, dest, &final, x, y);
 1878|       |
 1879|      0|		break;
 1880|       |
 1881|  27.8k|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (1881:2): [True: 27.8k, False: 82.0k]
  ------------------
 1882|  27.8k|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (1882:2): [True: 0, False: 109k]
  ------------------
 1883|       |		/* Could be either input or output. If there is a generate
 1884|       |		 * function, we are outputting.
 1885|       |		 */
 1886|  27.8k|		if (im->generate_fn) {
  ------------------
  |  Branch (1886:7): [True: 27.8k, False: 0]
  ------------------
 1887|  27.8k|			if (vips_region_prepare_to_generate(reg,
  ------------------
  |  Branch (1887:8): [True: 5.52k, False: 22.3k]
  ------------------
 1888|  27.8k|					dest, &final, x, y))
 1889|  5.52k|				return -1;
 1890|  27.8k|		}
 1891|      0|		else {
 1892|      0|			if (vips_region_image(reg, &final))
  ------------------
  |  Branch (1892:8): [True: 0, False: 0]
  ------------------
 1893|      0|				return -1;
 1894|      0|			vips_region_copy(reg, dest, &final, x, y);
 1895|      0|		}
 1896|       |
 1897|  22.3k|		break;
 1898|       |
 1899|  22.3k|	default:
  ------------------
  |  Branch (1899:2): [True: 0, False: 109k]
  ------------------
 1900|      0|		vips_error("vips_region_prepare_to",
 1901|      0|			_("unable to input from a %s image"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1902|      0|			vips_enum_nick(VIPS_TYPE_DEMAND_STYLE, im->dtype));
  ------------------
  |  |  136|      0|#define VIPS_TYPE_DEMAND_STYLE (vips_demand_style_get_type())
  ------------------
 1903|      0|		return -1;
 1904|   109k|	}
 1905|       |
 1906|       |	/* We've written fresh pixels to dest, it's no longer invalid (if it
 1907|       |	 * was).
 1908|       |	 *
 1909|       |	 * We need this extra thing here because, unlike
 1910|       |	 * vips_region_prepare(), we don't vips_region_buffer() dest before
 1911|       |	 * writing it.
 1912|       |	 */
 1913|  91.9k|	dest->invalid = FALSE;
  ------------------
  |  |  794|  91.9k|#define	FALSE	(0)
  ------------------
 1914|       |
 1915|  91.9k|	return 0;
 1916|   109k|}
vips__region_count_pixels:
 2071|  11.3k|{
 2072|  11.3k|	VipsImage *image = region->im;
 2073|  11.3k|	VipsImagePixels *pixels = g_object_get_qdata(G_OBJECT(image),
  ------------------
  |  |   51|  11.3k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  11.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  11.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2074|  11.3k|		vips__image_pixels_quark);
 2075|       |
 2076|  11.3k|	g_mutex_lock(&vips__global_lock);
 2077|  11.3k|	if (!pixels->tpels)
  ------------------
  |  Branch (2077:6): [True: 9.31k, False: 2.03k]
  ------------------
 2078|  9.31k|		pixels->tpels = VIPS_IMAGE_N_PELS(image);
  ------------------
  |  |  392|  9.31k|	((guint64) (I)->Xsize * (I)->Ysize)
  ------------------
 2079|  11.3k|	if (!pixels->nickname)
  ------------------
  |  Branch (2079:6): [True: 9.31k, False: 2.03k]
  ------------------
 2080|  9.31k|		pixels->nickname = nickname;
 2081|  11.3k|	pixels->npels += region->valid.width * region->valid.height;
 2082|  11.3k|	g_mutex_unlock(&vips__global_lock);
 2083|  11.3k|}
region.c:vips_region_class_init:
  468|      1|{
  469|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  470|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  471|       |
  472|      1|	gobject_class->finalize = vips_region_finalize;
  473|      1|	gobject_class->dispose = vips_region_dispose;
  474|       |
  475|      1|	vobject_class->summary = vips_region_summary;
  476|      1|	vobject_class->dump = vips_region_dump;
  477|      1|	vobject_class->build = vips_region_build;
  478|      1|}
region.c:vips_region_finalize:
  208|   342k|{
  209|       |#ifdef VIPS_DEBUG
  210|       |	VIPS_DEBUG_MSG("vips_region_finalize: ");
  211|       |	vips_object_print_name(VIPS_OBJECT(gobject));
  212|       |	VIPS_DEBUG_MSG("\n");
  213|       |#endif /*VIPS_DEBUG*/
  214|       |
  215|       |#ifdef VIPS_DEBUG
  216|       |	g_mutex_lock(&vips__global_lock);
  217|       |	vips__regions_all = g_slist_remove(vips__regions_all, gobject);
  218|       |	g_mutex_unlock(&vips__global_lock);
  219|       |#endif /*VIPS_DEBUG*/
  220|       |
  221|   342k|	G_OBJECT_CLASS(vips_region_parent_class)->finalize(gobject);
  ------------------
  |  |   58|   342k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|   342k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   342k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  222|   342k|}
region.c:vips_region_dispose:
  290|   342k|{
  291|   342k|	VipsRegion *region = VIPS_REGION(gobject);
  ------------------
  |  |   52|   342k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   342k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   342k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|   342k|		VIPS_TYPE_REGION, VipsRegion))
  ------------------
  292|   342k|	VipsImage *image = region->im;
  293|       |
  294|       |#ifdef VIPS_DEBUG
  295|       |	VIPS_DEBUG_MSG("vips_region_dispose: ");
  296|       |	vips_object_print_name(VIPS_OBJECT(gobject));
  297|       |	VIPS_DEBUG_MSG("\n");
  298|       |#endif /*VIPS_DEBUG*/
  299|       |
  300|   342k|	vips_object_preclose(VIPS_OBJECT(gobject));
  ------------------
  |  |  433|   342k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   342k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   342k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  301|       |
  302|       |	/* Stop this sequence.
  303|       |	 */
  304|   342k|	vips__region_stop(region);
  305|       |
  306|       |	/* Free any attached memory.
  307|       |	 */
  308|   342k|	VIPS_FREEF(vips_window_unref, region->window);
  ------------------
  |  |   41|   342k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   342k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   342k|	{ \
  |  |   43|   342k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 342k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|   342k|	} \
  |  |   48|   342k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   342k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  309|   342k|	VIPS_FREEF(vips_buffer_unref, region->buffer);
  ------------------
  |  |   41|   342k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   342k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   342k|	{ \
  |  |   43|   342k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 206k, False: 135k]
  |  |  ------------------
  |  |   44|   206k|			(void) F((S)); \
  |  |   45|   206k|			(S) = 0; \
  |  |   46|   206k|		} \
  |  |   47|   342k|	} \
  |  |   48|   342k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   342k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  310|       |
  311|       |	/* Detach from image.
  312|       |	 */
  313|   342k|	VIPS_GATE_START("vips_region_dispose: wait");
  ------------------
  |  |   41|   342k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   342k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   342k|	{ \
  |  |   43|   342k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 342k]
  |  |  ------------------
  |  |   44|   342k|			vips__thread_gate_start(NAME); \
  |  |   45|   342k|	} \
  |  |   46|   342k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   342k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  314|       |
  315|   342k|	g_mutex_lock(image->sslock);
  316|       |
  317|   342k|	VIPS_GATE_STOP("vips_region_dispose: wait");
  ------------------
  |  |   49|   342k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   342k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   342k|	{ \
  |  |   51|   342k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 342k]
  |  |  ------------------
  |  |   52|   342k|			vips__thread_gate_stop(NAME); \
  |  |   53|   342k|	} \
  |  |   54|   342k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   342k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  318|       |
  319|   342k|	image->regions = g_slist_remove(image->regions, region);
  320|       |
  321|   342k|	g_mutex_unlock(image->sslock);
  322|       |
  323|   342k|	region->im = NULL;
  324|       |
  325|   342k|	g_object_unref(image);
  326|       |
  327|   342k|	G_OBJECT_CLASS(vips_region_parent_class)->dispose(gobject);
  ------------------
  |  |   58|   342k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|   342k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   342k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  328|   342k|}
region.c:vips_region_build:
  440|   342k|{
  441|   342k|	VipsRegion *region = VIPS_REGION(object);
  ------------------
  |  |   52|   342k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   342k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   342k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|   342k|		VIPS_TYPE_REGION, VipsRegion))
  ------------------
  442|   342k|	VipsImage *image = region->im;
  443|       |
  444|   342k|	VIPS_DEBUG_MSG("vips_region_build: %p\n", region);
  ------------------
  |  |   47|   342k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   342k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   342k|	{ \
  |  |   49|   342k|		; \
  |  |   50|   342k|	} \
  |  |   51|   342k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   342k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  445|       |
  446|   342k|	if (VIPS_OBJECT_CLASS(vips_region_parent_class)->build(object))
  ------------------
  |  |  435|   342k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   342k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   342k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (446:6): [True: 0, False: 342k]
  ------------------
  447|      0|		return -1;
  448|       |
  449|   342k|	vips__region_take_ownership(region);
  450|       |
  451|       |	/* We're usually inside the ss lock anyway. But be safe ...
  452|       |	 */
  453|   342k|	VIPS_GATE_START("vips_region_build: wait");
  ------------------
  |  |   41|   342k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   342k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   342k|	{ \
  |  |   43|   342k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 342k]
  |  |  ------------------
  |  |   44|   342k|			vips__thread_gate_start(NAME); \
  |  |   45|   342k|	} \
  |  |   46|   342k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   342k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  454|       |
  455|   342k|	g_mutex_lock(image->sslock);
  456|       |
  457|   342k|	VIPS_GATE_STOP("vips_region_build: wait");
  ------------------
  |  |   49|   342k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   342k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   342k|	{ \
  |  |   51|   342k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 342k]
  |  |  ------------------
  |  |   52|   342k|			vips__thread_gate_stop(NAME); \
  |  |   53|   342k|	} \
  |  |   54|   342k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   342k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  458|       |
  459|   342k|	image->regions = g_slist_prepend(image->regions, region);
  460|       |
  461|   342k|	g_mutex_unlock(image->sslock);
  462|       |
  463|   342k|	return 0;
  464|   342k|}
region.c:vips_region_init:
  482|   342k|{
  483|   342k|	region->type = VIPS_REGION_NONE;
  484|       |
  485|       |#ifdef VIPS_DEBUG
  486|       |	g_mutex_lock(&vips__global_lock);
  487|       |	vips__regions_all = g_slist_prepend(vips__regions_all, region);
  488|       |	printf("vips_region_init: %d regions in vips\n",
  489|       |		g_slist_length(vips__regions_all));
  490|       |	g_mutex_unlock(&vips__global_lock);
  491|       |#endif /*VIPS_DEBUG*/
  492|   342k|}
region.c:vips_region_generate:
 1611|   377k|{
 1612|   377k|	VipsImage *im = reg->im;
 1613|       |
 1614|   377k|	gboolean stop;
 1615|       |
 1616|       |	/* Start new sequence, if necessary.
 1617|       |	 */
 1618|   377k|	if (vips__region_start(reg))
  ------------------
  |  Branch (1618:6): [True: 6.83k, False: 370k]
  ------------------
 1619|  6.83k|		return -1;
 1620|       |
 1621|       |	/* Ask for evaluation.
 1622|       |	 */
 1623|   370k|	stop = FALSE;
  ------------------
  |  |  794|   370k|#define	FALSE	(0)
  ------------------
 1624|   370k|	if (im->generate_fn(reg, reg->seq, im->client1, im->client2, &stop))
  ------------------
  |  Branch (1624:6): [True: 58.1k, False: 312k]
  ------------------
 1625|  58.1k|		return -1;
 1626|   312k|	if (stop) {
  ------------------
  |  Branch (1626:6): [True: 0, False: 312k]
  ------------------
 1627|      0|		vips_error("vips_region_generate",
 1628|      0|			"%s", _("stop requested"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1629|      0|		return -1;
 1630|      0|	}
 1631|       |
 1632|   312k|	return 0;
 1633|   312k|}
region.c:vips_region_prepare_to_generate:
 1729|   109k|{
 1730|   109k|	VipsImage *im = reg->im;
 1731|   109k|	VipsPel *p;
 1732|       |
 1733|   109k|	if (!im->generate_fn) {
  ------------------
  |  Branch (1733:6): [True: 0, False: 109k]
  ------------------
 1734|      0|		vips_error("vips_region_prepare_to",
 1735|      0|			"%s", _("incomplete header"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1736|      0|		return -1;
 1737|      0|	}
 1738|       |
 1739|   109k|	if (vips_region_region(reg, dest, r, x, y))
  ------------------
  |  Branch (1739:6): [True: 0, False: 109k]
  ------------------
 1740|      0|		return -1;
 1741|       |
 1742|       |	/* Remember where reg is pointing now.
 1743|       |	 */
 1744|   109k|	p = VIPS_REGION_ADDR(reg, reg->valid.left, reg->valid.top);
  ------------------
  |  |  227|   109k|	((R)->data + \
  |  |  228|   109k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   109k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   109k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   109k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   109k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   109k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1745|       |
 1746|       |	/* Run sequence into reg.
 1747|       |	 */
 1748|   109k|	if (vips_region_generate(reg, NULL))
  ------------------
  |  Branch (1748:6): [True: 17.9k, False: 91.9k]
  ------------------
 1749|  17.9k|		return -1;
 1750|       |
 1751|       |	/* The generate function may not have actually made any pixels ... it
 1752|       |	 * might just have redirected reg to point somewhere else. If it has,
 1753|       |	 * we need an extra copy operation.
 1754|       |	 */
 1755|  91.9k|	if (VIPS_REGION_ADDR(reg, reg->valid.left, reg->valid.top) != p)
  ------------------
  |  |  227|  91.9k|	((R)->data + \
  |  |  228|  91.9k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  91.9k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  91.9k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  91.9k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  91.9k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  91.9k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1755:6): [True: 36.4k, False: 55.5k]
  ------------------
 1756|  36.4k|		vips_region_copy(reg, dest, r, x, y);
 1757|       |
 1758|  91.9k|	return 0;
 1759|   109k|}

vips__reorder_set_input:
  171|   195k|{
  172|   195k|	VipsReorder *reorder = vips_reorder_get(image);
  173|       |
  174|   195k|	int i;
  175|   195k|	int total;
  176|       |
  177|       |	/* We have to support being called more than once on the same image.
  178|       |	 * Two cases:
  179|       |	 *
  180|       |	 * 1. in the first call, no images were set ... we throw away
  181|       |	 * everything from the first call and try again. foreign can do this.
  182|       |	 *
  183|       |	 * 2. warn if the args were different and do nothing.
  184|       |	 */
  185|   195k|	if (reorder->source) {
  ------------------
  |  Branch (185:6): [True: 15.5k, False: 179k]
  ------------------
  186|  15.5k|		if (reorder->n_inputs == 0) {
  ------------------
  |  Branch (186:7): [True: 15.5k, False: 0]
  ------------------
  187|  15.5k|			reorder->n_sources = 0;
  188|  15.5k|			vips_reorder_free(reorder);
  189|  15.5k|		}
  190|      0|		else {
  191|      0|			for (i = 0; in[i]; i++)
  ------------------
  |  Branch (191:16): [True: 0, False: 0]
  ------------------
  192|      0|				if (i >= reorder->n_inputs ||
  ------------------
  |  Branch (192:9): [True: 0, False: 0]
  ------------------
  193|      0|					in[i] != reorder->input[i]) {
  ------------------
  |  Branch (193:6): [True: 0, False: 0]
  ------------------
  194|       |					/* Should never happen.
  195|       |					 */
  196|      0|					g_warning("vips__reorder_set_input: args differ\n");
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  197|      0|					break;
  198|      0|				}
  199|       |
  200|      0|			return 0;
  201|      0|		}
  202|  15.5k|	}
  203|       |
  204|       |	/* Make a copy of the input array.
  205|       |	 */
  206|   359k|	for (i = 0; in[i]; i++)
  ------------------
  |  Branch (206:14): [True: 163k, False: 195k]
  ------------------
  207|   163k|		;
  208|   195k|	reorder->n_inputs = i;
  209|   195k|	reorder->input = VIPS_ARRAY(NULL, reorder->n_inputs + 1, VipsImage *);
  ------------------
  |  |   72|   195k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   195k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   195k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   195k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   195k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  210|   195k|	reorder->score = VIPS_ARRAY(NULL, reorder->n_inputs, int);
  ------------------
  |  |   72|   195k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   195k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   195k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   195k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   195k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  211|   195k|	reorder->recomp_order = VIPS_ARRAY(NULL, reorder->n_inputs, int);
  ------------------
  |  |   72|   195k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   195k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   195k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   195k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   195k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  212|   195k|	if (!reorder->input)
  ------------------
  |  Branch (212:6): [True: 0, False: 195k]
  ------------------
  213|      0|		return -1;
  214|   195k|	if (reorder->n_inputs &&
  ------------------
  |  Branch (214:6): [True: 159k, False: 36.2k]
  ------------------
  215|   195k|		(!reorder->score ||
  ------------------
  |  Branch (215:4): [True: 0, False: 159k]
  ------------------
  216|   159k|			!reorder->recomp_order))
  ------------------
  |  Branch (216:4): [True: 0, False: 159k]
  ------------------
  217|      0|		return -1;
  218|       |
  219|   359k|	for (i = 0; i < reorder->n_inputs; i++) {
  ------------------
  |  Branch (219:14): [True: 163k, False: 195k]
  ------------------
  220|   163k|		reorder->input[i] = in[i];
  221|   163k|		reorder->score[i] = 0;
  222|   163k|		reorder->recomp_order[i] = i;
  223|   163k|	}
  224|   195k|	reorder->input[i] = NULL;
  225|       |
  226|       |	/* Find the total number of source images -- this gives an upper bound
  227|       |	 * to the size of the unique source image array we will need.
  228|       |	 */
  229|   195k|	total = 0;
  230|   359k|	for (i = 0; i < reorder->n_inputs; i++)
  ------------------
  |  Branch (230:14): [True: 163k, False: 195k]
  ------------------
  231|   163k|		total += vips_reorder_get(reorder->input[i])->n_sources;
  232|       |
  233|       |	/* No source images means this must itself be a source image, so it has
  234|       |	 * a source image of itself.
  235|       |	 */
  236|   195k|	total = VIPS_MAX(1, total);
  ------------------
  |  |   54|   195k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 39.4k, False: 156k]
  |  |  ------------------
  ------------------
  237|       |
  238|   195k|	reorder->source = VIPS_ARRAY(NULL, total + 1, VipsImage *);
  ------------------
  |  |   72|   195k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   195k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   195k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   195k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   195k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  239|   195k|	reorder->cumulative_margin = VIPS_ARRAY(NULL, total, int);
  ------------------
  |  |   72|   195k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   195k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   195k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   195k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   195k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  240|   195k|	if (!reorder->source ||
  ------------------
  |  Branch (240:6): [True: 0, False: 195k]
  ------------------
  241|   195k|		!reorder->cumulative_margin)
  ------------------
  |  Branch (241:3): [True: 0, False: 195k]
  ------------------
  242|      0|		return -1;
  243|       |
  244|       |	/* Copy source images over, removing duplicates. If we find a
  245|       |	 * duplicate, we have a reordering opportunity, and we adjust the
  246|       |	 * scores of the two images containing the dupe.
  247|       |	 */
  248|   359k|	for (i = 0; i < reorder->n_inputs; i++) {
  ------------------
  |  Branch (248:14): [True: 163k, False: 195k]
  ------------------
  249|   163k|		VipsReorder *input = vips_reorder_get(reorder->input[i]);
  250|       |
  251|   163k|		int j;
  252|       |
  253|   324k|		for (j = 0; j < input->n_sources; j++) {
  ------------------
  |  Branch (253:15): [True: 160k, False: 163k]
  ------------------
  254|   160k|			int k;
  255|       |
  256|       |			/* Search for dupe.
  257|       |			 */
  258|   160k|			for (k = 0; k < reorder->n_sources; k++)
  ------------------
  |  Branch (258:16): [True: 4.58k, False: 156k]
  ------------------
  259|  4.58k|				if (reorder->source[k] == input->source[j])
  ------------------
  |  Branch (259:9): [True: 4.58k, False: 0]
  ------------------
  260|  4.58k|					break;
  261|       |
  262|   160k|			if (k < reorder->n_sources) {
  ------------------
  |  Branch (262:8): [True: 4.58k, False: 156k]
  ------------------
  263|       |				/* Found a dupe. Does this new use of
  264|       |				 * input->source[j] have a larger or smaller
  265|       |				 * margin? Adjust the score to reflect the
  266|       |				 * change, note the new max.
  267|       |				 */
  268|  4.58k|				reorder->score[i] +=
  269|  4.58k|					input->cumulative_margin[j] -
  270|  4.58k|					reorder->cumulative_margin[k];
  271|       |
  272|  4.58k|				reorder->cumulative_margin[k] = VIPS_MAX(
  ------------------
  |  |   54|  4.58k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 4.58k]
  |  |  ------------------
  ------------------
  273|  4.58k|					reorder->cumulative_margin[k],
  274|  4.58k|					input->cumulative_margin[j]);
  275|  4.58k|			}
  276|   156k|			else {
  277|       |				/* No dupe, just add to the table.
  278|       |				 */
  279|   156k|				reorder->source[reorder->n_sources] =
  280|   156k|					input->source[j];
  281|   156k|				reorder->cumulative_margin[reorder->n_sources] =
  282|   156k|					input->cumulative_margin[j];
  283|   156k|				reorder->n_sources += 1;
  284|   156k|			}
  285|   160k|		}
  286|   163k|	}
  287|       |
  288|       |	/* Sort recomp_order by score. qsort_r() is a GNU libc thing, don't use
  289|       |	 * it.
  290|       |	 */
  291|   195k|	if (reorder->n_inputs > 1)
  ------------------
  |  Branch (291:6): [True: 2.52k, False: 192k]
  ------------------
  292|       |#if GLIB_CHECK_VERSION(2, 82, 0)
  293|       |		g_sort_array
  294|       |#else
  295|  2.52k|		g_qsort_with_data
  296|  2.52k|#endif
  297|  2.52k|			(reorder->recomp_order,
  298|  2.52k|				reorder->n_inputs,
  299|  2.52k|				sizeof(int),
  300|  2.52k|				vips_reorder_compare_score, reorder);
  301|       |
  302|       |	/* No sources ... make one, us!
  303|       |	 */
  304|   195k|	if (reorder->n_inputs == 0) {
  ------------------
  |  Branch (304:6): [True: 36.2k, False: 159k]
  ------------------
  305|  36.2k|		reorder->source[0] = image;
  306|  36.2k|		reorder->cumulative_margin[0] = 0;
  307|  36.2k|		reorder->n_sources = 1;
  308|  36.2k|	}
  309|       |
  310|       |#ifdef DEBUG
  311|       |	vips_reorder_print(reorder);
  312|       |#endif /*DEBUG*/
  313|       |
  314|   195k|	return 0;
  315|   195k|}
vips_reorder_prepare_many:
  335|  37.9k|{
  336|  37.9k|	VipsReorder *reorder = vips_reorder_get(image);
  337|       |
  338|  37.9k|	int i;
  339|       |
  340|  80.0k|	for (i = 0; i < reorder->n_inputs; i++) {
  ------------------
  |  Branch (340:14): [True: 48.6k, False: 31.3k]
  ------------------
  341|  48.6k|		g_assert(regions[i]);
  ------------------
  |  |  166|  48.6k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  48.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  48.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  342|       |
  343|  48.6k|		if (vips_region_prepare(
  ------------------
  |  Branch (343:7): [True: 6.66k, False: 42.0k]
  ------------------
  344|  48.6k|				regions[reorder->recomp_order[i]], r))
  345|  6.66k|			return -1;
  346|  48.6k|	}
  347|       |
  348|  31.3k|	return 0;
  349|  37.9k|}
vips__reorder_clear:
  379|  11.9k|{
  380|  11.9k|	g_object_set_qdata(G_OBJECT(image),
  ------------------
  |  |   51|  11.9k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  11.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  11.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  381|  11.9k|		vips__image_reorder_quark, NULL);
  382|  11.9k|}
vips__reorder_init:
  386|      2|{
  387|      2|	if (!vips__image_reorder_quark)
  ------------------
  |  Branch (387:6): [True: 2, False: 0]
  ------------------
  388|      2|		vips__image_reorder_quark =
  389|      2|			g_quark_from_static_string("vips-image-reorder");
  390|      2|}
reorder.c:vips_reorder_get:
  136|   561k|{
  137|   561k|	VipsReorder *reorder;
  138|       |
  139|   561k|	if ((reorder = g_object_get_qdata(G_OBJECT(image),
  ------------------
  |  |   51|   561k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|   561k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   561k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (139:6): [True: 378k, False: 183k]
  ------------------
  140|   561k|			 vips__image_reorder_quark)))
  141|   378k|		return reorder;
  142|       |
  143|   183k|	reorder = VIPS_NEW(NULL, VipsReorder);
  ------------------
  |  |   70|   183k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   183k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   183k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   183k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   183k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|   183k|	reorder->image = image;
  145|   183k|	reorder->n_inputs = 0;
  146|   183k|	reorder->input = NULL;
  147|   183k|	reorder->score = NULL;
  148|   183k|	reorder->recomp_order = NULL;
  149|   183k|	reorder->n_sources = 0;
  150|   183k|	reorder->source = NULL;
  151|   183k|	reorder->cumulative_margin = NULL;
  152|       |
  153|   183k|	g_object_set_qdata_full(G_OBJECT(image), vips__image_reorder_quark,
  ------------------
  |  |   51|   183k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|   183k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   183k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  154|   183k|		reorder, (GDestroyNotify) vips_reorder_destroy);
  155|       |
  156|   183k|	return reorder;
  157|   561k|}
reorder.c:vips_reorder_destroy:
  129|   182k|{
  130|   182k|	vips_reorder_free(reorder);
  131|   182k|	VIPS_FREE(reorder);
  ------------------
  |  |   50|   182k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   182k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   182k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   182k|	{ \
  |  |  |  |   43|   182k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 182k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   182k|			(void) F((S)); \
  |  |  |  |   45|   182k|			(S) = 0; \
  |  |  |  |   46|   182k|		} \
  |  |  |  |   47|   182k|	} \
  |  |  |  |   48|   182k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   182k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|   182k|}
reorder.c:vips_reorder_free:
  115|   198k|{
  116|       |	/* We free explicitly, rather than using VIPS_ARRAY(image, ...), since
  117|       |	 * we need to make sure these pointers are valid to this point in the
  118|       |	 * close cycle.
  119|       |	 */
  120|   198k|	VIPS_FREE(reorder->input);
  ------------------
  |  |   50|   198k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   198k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   198k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   198k|	{ \
  |  |  |  |   43|   198k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 195k, False: 3.24k]
  |  |  |  |  ------------------
  |  |  |  |   44|   195k|			(void) F((S)); \
  |  |  |  |   45|   195k|			(S) = 0; \
  |  |  |  |   46|   195k|		} \
  |  |  |  |   47|   198k|	} \
  |  |  |  |   48|   198k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   198k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  121|   198k|	VIPS_FREE(reorder->score);
  ------------------
  |  |   50|   198k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   198k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   198k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   198k|	{ \
  |  |  |  |   43|   198k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 159k, False: 39.4k]
  |  |  |  |  ------------------
  |  |  |  |   44|   159k|			(void) F((S)); \
  |  |  |  |   45|   159k|			(S) = 0; \
  |  |  |  |   46|   159k|		} \
  |  |  |  |   47|   198k|	} \
  |  |  |  |   48|   198k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   198k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  122|   198k|	VIPS_FREE(reorder->recomp_order);
  ------------------
  |  |   50|   198k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   198k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   198k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   198k|	{ \
  |  |  |  |   43|   198k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 159k, False: 39.4k]
  |  |  |  |  ------------------
  |  |  |  |   44|   159k|			(void) F((S)); \
  |  |  |  |   45|   159k|			(S) = 0; \
  |  |  |  |   46|   159k|		} \
  |  |  |  |   47|   198k|	} \
  |  |  |  |   48|   198k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   198k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  123|   198k|	VIPS_FREE(reorder->source);
  ------------------
  |  |   50|   198k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   198k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   198k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   198k|	{ \
  |  |  |  |   43|   198k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 195k, False: 3.24k]
  |  |  |  |  ------------------
  |  |  |  |   44|   195k|			(void) F((S)); \
  |  |  |  |   45|   195k|			(S) = 0; \
  |  |  |  |   46|   195k|		} \
  |  |  |  |   47|   198k|	} \
  |  |  |  |   48|   198k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   198k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  124|   198k|	VIPS_FREE(reorder->cumulative_margin);
  ------------------
  |  |   50|   198k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   198k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   198k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   198k|	{ \
  |  |  |  |   43|   198k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 195k, False: 3.24k]
  |  |  |  |  ------------------
  |  |  |  |   44|   195k|			(void) F((S)); \
  |  |  |  |   45|   195k|			(S) = 0; \
  |  |  |  |   46|   195k|		} \
  |  |  |  |   47|   198k|	} \
  |  |  |  |   48|   198k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   198k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  125|   198k|}
reorder.c:vips_reorder_compare_score:
  161|  4.58k|{
  162|  4.58k|	int i1 = *((int *) a);
  163|  4.58k|	int i2 = *((int *) b);
  164|  4.58k|	VipsReorder *reorder = (VipsReorder *) arg;
  165|       |
  166|  4.58k|	return reorder->score[i2] - reorder->score[i1];
  167|  4.58k|}

vips_sbuf_new_from_source:
  113|  2.49k|{
  114|  2.49k|	VipsSbuf *sbuf;
  115|       |
  116|  2.49k|	g_assert(source);
  ------------------
  |  |  166|  2.49k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.49k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.49k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  117|       |
  118|  2.49k|	sbuf = VIPS_SBUF(g_object_new(VIPS_TYPE_SBUF,
  ------------------
  |  |   46|  2.49k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.49k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.49k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   47|  2.49k|		VIPS_TYPE_SBUF, VipsSbuf))
  ------------------
  119|  2.49k|		"input", source,
  120|  2.49k|		NULL));
  121|       |
  122|  2.49k|	if (vips_object_build(VIPS_OBJECT(sbuf))) {
  ------------------
  |  |  433|  2.49k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  2.49k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.49k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (122:6): [True: 0, False: 2.49k]
  ------------------
  123|      0|		VIPS_UNREF(sbuf);
  ------------------
  |  |   57|      0|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  124|      0|		return NULL;
  125|      0|	}
  126|       |
  127|  2.49k|	return sbuf;
  128|  2.49k|}
vips_sbuf_getc:
  189|  3.39k|{
  190|  3.39k|	if (sbuf->read_point == sbuf->chars_in_buffer &&
  ------------------
  |  Branch (190:6): [True: 3.39k, False: 0]
  ------------------
  191|  3.39k|		vips_sbuf_refill(sbuf) <= 0)
  ------------------
  |  Branch (191:3): [True: 597, False: 2.79k]
  ------------------
  192|    597|		return -1;
  193|       |
  194|  3.39k|	g_assert(sbuf->read_point < sbuf->chars_in_buffer);
  ------------------
  |  |  166|  3.39k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.79k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.39k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  195|       |
  196|  2.79k|	return sbuf->input_buffer[sbuf->read_point++];
  197|  3.39k|}
vips_sbuf_require:
  247|    166|{
  248|    166|	g_assert(require < VIPS_SBUF_BUFFER_SIZE);
  ------------------
  |  |  166|    166|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    166|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    166|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  249|    166|	g_assert(sbuf->chars_in_buffer >= 0);
  ------------------
  |  |  166|    166|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    166|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    166|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|    166|	g_assert(sbuf->chars_in_buffer <= VIPS_SBUF_BUFFER_SIZE);
  ------------------
  |  |  166|    166|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    166|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    166|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  251|    166|	g_assert(sbuf->read_point >= 0);
  ------------------
  |  |  166|    166|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    166|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    166|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  252|    166|	g_assert(sbuf->read_point <= sbuf->chars_in_buffer);
  ------------------
  |  |  166|    166|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    166|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    166|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  253|       |
  254|    166|	VIPS_DEBUG_MSG("vips_sbuf_require: %d\n", require);
  ------------------
  |  |   47|    166|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    166|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    166|	{ \
  |  |   49|    166|		; \
  |  |   50|    166|	} \
  |  |   51|    166|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    166|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  255|       |
  256|    166|	if (sbuf->read_point + require > sbuf->chars_in_buffer) {
  ------------------
  |  Branch (256:6): [True: 166, False: 0]
  ------------------
  257|       |		/* Areas can overlap, so we must memmove().
  258|       |		 */
  259|    166|		memmove(sbuf->input_buffer,
  260|    166|			sbuf->input_buffer + sbuf->read_point,
  261|    166|			sbuf->chars_in_buffer - sbuf->read_point);
  262|    166|		sbuf->chars_in_buffer -= sbuf->read_point;
  263|    166|		sbuf->read_point = 0;
  264|       |
  265|    275|		while (require > sbuf->chars_in_buffer) {
  ------------------
  |  Branch (265:10): [True: 166, False: 109]
  ------------------
  266|    166|			unsigned char *to = sbuf->input_buffer +
  267|    166|				sbuf->chars_in_buffer;
  268|    166|			int space_available =
  269|    166|				VIPS_SBUF_BUFFER_SIZE -
  ------------------
  |  |   59|    166|#define VIPS_SBUF_BUFFER_SIZE (4096)
  ------------------
  270|    166|				sbuf->chars_in_buffer;
  271|    166|			gint64 bytes_read;
  272|       |
  273|    166|			if ((bytes_read = vips_source_read(sbuf->source,
  ------------------
  |  Branch (273:8): [True: 0, False: 166]
  ------------------
  274|    166|					 to, space_available)) < 0)
  275|      0|				return -1;
  276|    166|			if (bytes_read == 0) {
  ------------------
  |  Branch (276:8): [True: 57, False: 109]
  ------------------
  277|     57|				vips_error(
  278|     57|					vips_connection_nick(VIPS_CONNECTION(
  ------------------
  |  |   48|     57|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     57|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     57|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|     57|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  279|     57|						sbuf->source)),
  280|     57|					"%s", _("end of file"));
  ------------------
  |  |   30|     57|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     57|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  281|     57|				return -1;
  282|     57|			}
  283|       |
  284|    109|			to[bytes_read] = '\0';
  285|    109|			sbuf->chars_in_buffer += bytes_read;
  286|    109|		}
  287|    166|	}
  288|       |
  289|    109|	return 0;
  290|    166|}
vips_sbuf_get_line:
  344|  13.7k|{
  345|  13.7k|	int write_point;
  346|  13.7k|	int space_remaining;
  347|  13.7k|	int ch;
  348|       |
  349|  13.7k|	VIPS_DEBUG_MSG("vips_sbuf_get_line:\n");
  ------------------
  |  |   47|  13.7k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  13.7k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  13.7k|	{ \
  |  |   49|  13.7k|		; \
  |  |   50|  13.7k|	} \
  |  |   51|  13.7k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  13.7k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  350|       |
  351|  13.7k|	write_point = 0;
  352|  13.7k|	space_remaining = VIPS_SBUF_BUFFER_SIZE;
  ------------------
  |  |   59|  13.7k|#define VIPS_SBUF_BUFFER_SIZE (4096)
  ------------------
  353|       |
  354|  1.06M|	while ((ch = VIPS_SBUF_GETC(sbuf)) != -1 &&
  ------------------
  |  |  109|  1.06M|#define VIPS_SBUF_GETC(S) ( \
  |  |  110|  1.06M|	(S)->read_point < (S)->chars_in_buffer \
  |  |  ------------------
  |  |  |  Branch (110:2): [True: 1.05M, False: 3.21k]
  |  |  ------------------
  |  |  111|  1.06M|		? (S)->input_buffer[(S)->read_point++] \
  |  |  112|  1.06M|		: vips_sbuf_getc(S))
  ------------------
  |  Branch (354:9): [True: 1.06M, False: 583]
  ------------------
  355|  1.06M|		ch != '\n' &&
  ------------------
  |  Branch (355:3): [True: 1.04M, False: 13.1k]
  ------------------
  356|  1.06M|		space_remaining > 0) {
  ------------------
  |  Branch (356:3): [True: 1.04M, False: 58]
  ------------------
  357|  1.04M|		sbuf->line[write_point] = ch;
  358|  1.04M|		write_point += 1;
  359|  1.04M|		space_remaining -= 1;
  360|  1.04M|	}
  361|  13.7k|	sbuf->line[write_point] = '\0';
  362|       |
  363|       |	/* If we hit EOF immediately, return EOF.
  364|       |	 */
  365|  13.7k|	if (ch == -1 &&
  ------------------
  |  Branch (365:6): [True: 583, False: 13.1k]
  ------------------
  366|  13.7k|		write_point == 0)
  ------------------
  |  Branch (366:3): [True: 69, False: 514]
  ------------------
  367|     69|		return NULL;
  368|       |
  369|       |	/* If the final char in the buffer is \r, this is probably a DOS file
  370|       |	 * and we should remove that too.
  371|       |	 *
  372|       |	 * There's a chance this could incorrectly remove \r in very long
  373|       |	 * lines, but ignore this.
  374|       |	 */
  375|  13.6k|	if (write_point > 0 &&
  ------------------
  |  Branch (375:6): [True: 13.5k, False: 104]
  ------------------
  376|  13.6k|		sbuf->line[write_point - 1] == '\r')
  ------------------
  |  Branch (376:3): [True: 3.75k, False: 9.82k]
  ------------------
  377|  3.75k|		sbuf->line[write_point - 1] = '\0';
  378|       |	/* If we filled the output line without seeing \n, keep going to the
  379|       |	 * next \n.
  380|       |	 */
  381|  13.6k|	if (ch != '\n' &&
  ------------------
  |  Branch (381:6): [True: 572, False: 13.1k]
  ------------------
  382|  13.6k|		space_remaining == 0) {
  ------------------
  |  Branch (382:3): [True: 58, False: 514]
  ------------------
  383|   693k|		while ((ch = VIPS_SBUF_GETC(sbuf)) != -1 &&
  ------------------
  |  |  109|   693k|#define VIPS_SBUF_GETC(S) ( \
  |  |  110|   693k|	(S)->read_point < (S)->chars_in_buffer \
  |  |  ------------------
  |  |  |  Branch (110:2): [True: 693k, False: 173]
  |  |  ------------------
  |  |  111|   693k|		? (S)->input_buffer[(S)->read_point++] \
  |  |  112|   693k|		: vips_sbuf_getc(S))
  ------------------
  |  Branch (383:10): [True: 693k, False: 14]
  ------------------
  384|   693k|			ch != '\n')
  ------------------
  |  Branch (384:4): [True: 693k, False: 44]
  ------------------
  385|   693k|			;
  386|     58|	}
  387|       |
  388|  13.6k|	VIPS_DEBUG_MSG("    %s\n", sbuf->line);
  ------------------
  |  |   47|  13.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  13.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  13.6k|	{ \
  |  |   49|  13.6k|		; \
  |  |   50|  13.6k|	} \
  |  |   51|  13.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  13.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  389|       |
  390|  13.6k|	return (const char *) sbuf->line;
  391|  13.7k|}
sbuf.c:vips_sbuf_class_init:
   77|      1|{
   78|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   79|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   80|       |
   81|      1|	gobject_class->set_property = vips_object_set_property;
   82|      1|	gobject_class->get_property = vips_object_get_property;
   83|       |
   84|      1|	object_class->nickname = "sbuf";
   85|      1|	object_class->description = _("buffered source");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
   86|       |
   87|      1|	VIPS_ARG_OBJECT(class, "input", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
   88|      1|		_("Input"),
   89|      1|		_("Source to load from"),
   90|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
   91|      1|		G_STRUCT_OFFSET(VipsSbuf, source),
   92|      1|		VIPS_TYPE_SOURCE);
   93|      1|}
sbuf.c:vips_sbuf_init:
   97|  2.49k|{
   98|  2.49k|	sbuf->read_point = 0;
   99|  2.49k|	sbuf->chars_in_buffer = 0;
  100|  2.49k|	sbuf->input_buffer[0] = '\0';
  101|  2.49k|}
sbuf.c:vips_sbuf_refill:
  152|  3.39k|{
  153|  3.39k|	gint64 bytes_read;
  154|       |
  155|  3.39k|	VIPS_DEBUG_MSG("vips_sbuf_refill:\n");
  ------------------
  |  |   47|  3.39k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  3.39k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  3.39k|	{ \
  |  |   49|  3.39k|		; \
  |  |   50|  3.39k|	} \
  |  |   51|  3.39k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.39k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  156|       |
  157|       |	/* We should not discard any unread bytes.
  158|       |	 */
  159|  3.39k|	g_assert(sbuf->read_point == sbuf->chars_in_buffer);
  ------------------
  |  |  166|  3.39k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  3.39k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.39k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  160|       |
  161|  3.39k|	bytes_read = vips_source_read(sbuf->source,
  162|  3.39k|		sbuf->input_buffer, VIPS_SBUF_BUFFER_SIZE);
  ------------------
  |  |   59|  3.39k|#define VIPS_SBUF_BUFFER_SIZE (4096)
  ------------------
  163|  3.39k|	if (bytes_read == -1)
  ------------------
  |  Branch (163:6): [True: 0, False: 3.39k]
  ------------------
  164|      0|		return -1;
  165|       |
  166|  3.39k|	sbuf->read_point = 0;
  167|  3.39k|	sbuf->chars_in_buffer = bytes_read;
  168|       |
  169|       |	/* Always add a null byte so we can use strchr() etc. on lines. This is
  170|       |	 * safe because input_buffer is VIPS_SBUF_BUFFER_SIZE + 1 bytes.
  171|       |	 */
  172|  3.39k|	sbuf->input_buffer[bytes_read] = '\0';
  173|       |
  174|  3.39k|	return bytes_read;
  175|  3.39k|}

vips_semaphore_init:
   60|   179k|{
   61|   179k|	s->v = v;
   62|   179k|	s->name = name;
   63|   179k|	s->mutex = vips_g_mutex_new();
   64|   179k|	s->cond = vips_g_cond_new();
   65|   179k|}
vips_semaphore_destroy:
   69|   179k|{
   70|   179k|	VIPS_FREEF(vips_g_mutex_free, s->mutex);
  ------------------
  |  |   41|   179k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   179k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   179k|	{ \
  |  |   43|   179k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 179k, False: 0]
  |  |  ------------------
  |  |   44|   179k|			(void) F((S)); \
  |  |   45|   179k|			(S) = 0; \
  |  |   46|   179k|		} \
  |  |   47|   179k|	} \
  |  |   48|   179k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   179k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   71|   179k|	VIPS_FREEF(vips_g_cond_free, s->cond);
  ------------------
  |  |   41|   179k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   179k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   179k|	{ \
  |  |   43|   179k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 179k, False: 0]
  |  |  ------------------
  |  |   44|   179k|			(void) F((S)); \
  |  |   45|   179k|			(S) = 0; \
  |  |   46|   179k|		} \
  |  |   47|   179k|	} \
  |  |   48|   179k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   179k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   72|   179k|}
vips_semaphore_upn:
   79|   271k|{
   80|   271k|	int value_after_op;
   81|       |
   82|   271k|	g_mutex_lock(s->mutex);
   83|   271k|	s->v += n;
   84|   271k|	value_after_op = s->v;
   85|       |
   86|       |	/* If we are only incrementing by one, we only need to wake a single
   87|       |	 * thread. If we are incrementing by a lot, we must wake all threads.
   88|       |	 */
   89|   271k|	if (n == 1)
  ------------------
  |  Branch (89:6): [True: 193k, False: 77.2k]
  ------------------
   90|   193k|		g_cond_signal(s->cond);
   91|  77.2k|	else
   92|  77.2k|		g_cond_broadcast(s->cond);
   93|   271k|	g_mutex_unlock(s->mutex);
   94|       |
   95|       |#ifdef DEBUG_IO
   96|       |	printf("vips_semaphore_upn(\"%s\",%d) = %d\n",
   97|       |		s->name, n, value_after_op);
   98|       |	if (value_after_op > 1)
   99|       |		vips_error("vips_semaphore_upn", "up over 1!");
  100|       |#endif /*DEBUG_IO*/
  101|       |
  102|   271k|	return value_after_op;
  103|   271k|}
vips_semaphore_up:
  109|   116k|{
  110|   116k|	return vips_semaphore_upn(s, 1);
  111|   116k|}
vips_semaphore_downn:
  158|  60.9k|{
  159|  60.9k|	g_assert(n >= 0);
  ------------------
  |  |  166|  60.9k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  60.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  60.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  160|       |
  161|  60.9k|	return vips__semaphore_downn_until(s, n, -1);
  162|  60.9k|}
vips_semaphore_down:
  168|  95.9k|{
  169|  95.9k|	return vips__semaphore_downn_until(s, 1, -1);
  170|  95.9k|}
vips_semaphore_down_timeout:
  178|      6|{
  179|      6|	gint64 end_time = g_get_monotonic_time() + timeout;
  180|       |
  181|      6|	return vips__semaphore_downn_until(s, 1, end_time);
  182|      6|}
semaphore.c:vips__semaphore_downn_until:
  118|   156k|{
  119|   156k|	int value_after_op;
  120|       |
  121|   156k|	VIPS_GATE_START("vips__semaphore_downn_until: wait");
  ------------------
  |  |   41|   156k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   156k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   156k|	{ \
  |  |   43|   156k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 156k]
  |  |  ------------------
  |  |   44|   156k|			vips__thread_gate_start(NAME); \
  |  |   45|   156k|	} \
  |  |   46|   156k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   156k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  122|       |
  123|   156k|	g_mutex_lock(s->mutex);
  124|       |
  125|   262k|	while (s->v < n) {
  ------------------
  |  Branch (125:9): [True: 105k, False: 156k]
  ------------------
  126|   105k|		if (end_time == -1)
  ------------------
  |  Branch (126:7): [True: 105k, False: 6]
  ------------------
  127|   105k|			vips__worker_cond_wait(s->cond, s->mutex);
  128|      6|		else if (!g_cond_wait_until(s->cond, s->mutex, end_time)) {
  ------------------
  |  Branch (128:12): [True: 0, False: 6]
  ------------------
  129|       |			/* timeout has passed.
  130|       |			 */
  131|      0|			g_mutex_unlock(s->mutex);
  132|       |
  133|      0|			VIPS_GATE_STOP("vips__semaphore_downn_until: wait");
  ------------------
  |  |   49|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|      0|	{ \
  |  |   51|      0|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   52|      0|			vips__thread_gate_stop(NAME); \
  |  |   53|      0|	} \
  |  |   54|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  134|      0|			return -1;
  135|      0|		}
  136|   105k|	}
  137|       |
  138|   156k|	s->v -= n;
  139|   156k|	value_after_op = s->v;
  140|       |
  141|   156k|	g_mutex_unlock(s->mutex);
  142|       |
  143|       |#ifdef DEBUG_IO
  144|       |	printf("vips__semaphore_downn_until(\"%s\",%d): %d\n",
  145|       |		s->name, n, value_after_op);
  146|       |#endif /*DEBUG_IO*/
  147|       |
  148|   156k|	VIPS_GATE_STOP("vips__semaphore_downn_until: wait");
  ------------------
  |  |   49|   156k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   156k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   156k|	{ \
  |  |   51|   156k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 156k]
  |  |  ------------------
  |  |   52|   156k|			vips__thread_gate_stop(NAME); \
  |  |   53|   156k|	} \
  |  |   54|   156k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   156k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  149|       |
  150|   156k|	return value_after_op;
  151|   156k|}

vips_sink_base_init:
  359|  28.4k|{
  360|       |	/* Always clear kill before we start looping. See the
  361|       |	 * call to vips_image_iskilled() below.
  362|       |	 */
  363|  28.4k|	vips_image_set_kill(image, FALSE);
  ------------------
  |  |  794|  28.4k|#define	FALSE	(0)
  ------------------
  364|       |
  365|  28.4k|	sink_base->im = image;
  366|  28.4k|	sink_base->x = 0;
  367|  28.4k|	sink_base->y = 0;
  368|       |
  369|  28.4k|	vips_get_tile_size(image,
  370|  28.4k|		&sink_base->tile_width, &sink_base->tile_height,
  371|  28.4k|		&sink_base->n_lines);
  372|       |
  373|  28.4k|	sink_base->processed = 0;
  374|  28.4k|}
vips_sink_base_progress:
  430|  15.9k|{
  431|  15.9k|	SinkBase *sink_base = (SinkBase *) a;
  432|       |
  433|  15.9k|	VIPS_DEBUG_MSG("vips_sink_base_progress:\n");
  ------------------
  |  |   47|  15.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  15.9k|	{ \
  |  |   49|  15.9k|		; \
  |  |   50|  15.9k|	} \
  |  |   51|  15.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  434|       |
  435|       |	/* Trigger any eval callbacks on our source image and
  436|       |	 * check for errors.
  437|       |	 */
  438|  15.9k|	vips_image_eval(sink_base->im, sink_base->processed);
  439|  15.9k|	if (vips_image_iskilled(sink_base->im))
  ------------------
  |  Branch (439:6): [True: 0, False: 15.9k]
  ------------------
  440|      0|		return -1;
  441|       |
  442|  15.9k|	return 0;
  443|  15.9k|}

vips_sink_disc:
  509|  10.9k|{
  510|  10.9k|	Write write;
  511|  10.9k|	int result;
  512|       |
  513|  10.9k|	vips_image_preeval(im);
  514|       |
  515|  10.9k|	write_init(&write, im, write_fn, a);
  516|       |
  517|  10.9k|	result = 0;
  518|  10.9k|	if (!write.buf ||
  ------------------
  |  Branch (518:6): [True: 0, False: 10.9k]
  ------------------
  519|  10.9k|		!write.buf_back ||
  ------------------
  |  Branch (519:3): [True: 0, False: 10.9k]
  ------------------
  520|  10.9k|		wbuffer_position(write.buf, 0, write.sink_base.n_lines) ||
  ------------------
  |  Branch (520:3): [True: 0, False: 10.9k]
  ------------------
  521|  10.9k|		vips_threadpool_run(im,
  ------------------
  |  Branch (521:3): [True: 6.88k, False: 4.03k]
  ------------------
  522|  10.9k|			write_thread_state_new,
  523|  10.9k|			wbuffer_allocate_fn,
  524|  10.9k|			wbuffer_work_fn,
  525|  10.9k|			vips_sink_base_progress,
  526|  10.9k|			&write))
  527|  6.88k|		result = -1;
  528|       |
  529|       |	/* Just before allocate signalled stop, it set write.buf writing. We
  530|       |	 * need to wait for this write to finish.
  531|       |	 *
  532|       |	 * We can't just free the buffers (which will wait for the bg threads
  533|       |	 * to finish), since the bg thread might see the kill before it gets a
  534|       |	 * chance to write.
  535|       |	 *
  536|       |	 * If the pool exited with an error, write.buf might not have been
  537|       |	 * started (if the allocate failed), and in any case, we don't care if
  538|       |	 * the final write went through or not.
  539|       |	 */
  540|  10.9k|	if (!result)
  ------------------
  |  Branch (540:6): [True: 4.03k, False: 6.88k]
  ------------------
  541|  4.03k|		vips_semaphore_down(&write.buf->done);
  542|       |
  543|  10.9k|	vips_image_posteval(im);
  544|       |
  545|       |	/* The final write might have failed, pick up any error code.
  546|       |	 */
  547|  10.9k|	result |= write_check_error(&write);
  548|       |
  549|  10.9k|	write_free(&write);
  550|       |
  551|  10.9k|	vips_image_minimise_all(im);
  552|       |
  553|  10.9k|	return result;
  554|  10.9k|}
sinkdisc.c:write_thread_state_class_init:
  133|      1|{
  134|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  135|       |
  136|      1|	object_class->nickname = "writethreadstate";
  137|      1|	object_class->description = _("per-thread state for sinkdisc");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  138|      1|}
sinkdisc.c:write_thread_state_init:
  142|  10.9k|{
  143|  10.9k|	state->buf = NULL;
  144|  10.9k|}
sinkdisc.c:write_init:
  456|  10.9k|{
  457|  10.9k|	vips_sink_base_init(&write->sink_base, image);
  458|       |
  459|  10.9k|	write->buf = wbuffer_new(write);
  460|  10.9k|	write->buf_back = wbuffer_new(write);
  461|  10.9k|	write->write_fn = write_fn;
  462|  10.9k|	write->a = a;
  463|  10.9k|}
sinkdisc.c:wbuffer_new:
  227|  21.8k|{
  228|  21.8k|	WriteBuffer *wbuffer;
  229|       |
  230|  21.8k|	if (!(wbuffer = VIPS_NEW(NULL, WriteBuffer)))
  ------------------
  |  |   70|  21.8k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  21.8k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  21.8k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  21.8k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  21.8k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (230:6): [True: 0, False: 21.8k]
  ------------------
  231|      0|		return NULL;
  232|  21.8k|	wbuffer->write = write;
  233|  21.8k|	wbuffer->region = NULL;
  234|  21.8k|	vips_semaphore_init(&wbuffer->go, 0, "go");
  235|  21.8k|	vips_semaphore_init(&wbuffer->nwrite, 0, "nwrite");
  236|  21.8k|	vips_semaphore_init(&wbuffer->done, 0, "done");
  237|  21.8k|	vips_semaphore_init(&wbuffer->finish, 0, "finish");
  238|  21.8k|	wbuffer->write_errno = 0;
  239|  21.8k|	wbuffer->running = FALSE;
  ------------------
  |  |  794|  21.8k|#define	FALSE	(0)
  ------------------
  240|  21.8k|	wbuffer->kill = FALSE;
  ------------------
  |  |  794|  21.8k|#define	FALSE	(0)
  ------------------
  241|       |
  242|  21.8k|	if (!(wbuffer->region = vips_region_new(write->sink_base.im))) {
  ------------------
  |  Branch (242:6): [True: 0, False: 21.8k]
  ------------------
  243|      0|		wbuffer_free(wbuffer);
  244|      0|		return NULL;
  245|      0|	}
  246|       |
  247|       |	/* The worker threads need to be able to move the buffers around.
  248|       |	 */
  249|  21.8k|	vips__region_no_ownership(wbuffer->region);
  250|       |
  251|       |	/* Make this last (picks up parts of wbuffer on startup).
  252|       |	 */
  253|  21.8k|	if (vips_thread_execute("wbuffer", wbuffer_write_thread, wbuffer)) {
  ------------------
  |  Branch (253:6): [True: 0, False: 21.8k]
  ------------------
  254|      0|		wbuffer_free(wbuffer);
  255|      0|		return NULL;
  256|      0|	}
  257|       |
  258|  21.8k|	wbuffer->running = TRUE;
  ------------------
  |  |  798|  21.8k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  21.8k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  259|       |
  260|  21.8k|	return wbuffer;
  261|  21.8k|}
sinkdisc.c:wbuffer_free:
  156|  21.8k|{
  157|       |	/* Is there a thread running this region? Kill it!
  158|       |	 */
  159|  21.8k|	if (wbuffer->running) {
  ------------------
  |  Branch (159:6): [True: 21.8k, False: 0]
  ------------------
  160|  21.8k|		wbuffer->kill = TRUE;
  ------------------
  |  |  798|  21.8k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  21.8k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  161|  21.8k|		vips_semaphore_up(&wbuffer->go);
  162|       |
  163|  21.8k|		vips_semaphore_down(&wbuffer->finish);
  164|       |
  165|  21.8k|		VIPS_DEBUG_MSG("wbuffer_free:\n");
  ------------------
  |  |   47|  21.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  21.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  21.8k|	{ \
  |  |   49|  21.8k|		; \
  |  |   50|  21.8k|	} \
  |  |   51|  21.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  21.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  166|       |
  167|  21.8k|		wbuffer->running = FALSE;
  ------------------
  |  |  794|  21.8k|#define	FALSE	(0)
  ------------------
  168|  21.8k|	}
  169|       |
  170|  21.8k|	VIPS_UNREF(wbuffer->region);
  ------------------
  |  |   57|  21.8k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  21.8k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  21.8k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  21.8k|	{ \
  |  |  |  |   43|  21.8k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 21.8k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  21.8k|			(void) F((S)); \
  |  |  |  |   45|  21.8k|			(S) = 0; \
  |  |  |  |   46|  21.8k|		} \
  |  |  |  |   47|  21.8k|	} \
  |  |  |  |   48|  21.8k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  21.8k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  171|  21.8k|	vips_semaphore_destroy(&wbuffer->go);
  172|  21.8k|	vips_semaphore_destroy(&wbuffer->nwrite);
  173|  21.8k|	vips_semaphore_destroy(&wbuffer->done);
  174|  21.8k|	vips_semaphore_destroy(&wbuffer->finish);
  175|  21.8k|	g_free(wbuffer);
  176|  21.8k|}
sinkdisc.c:wbuffer_write_thread:
  198|  21.8k|{
  199|  21.8k|	WriteBuffer *wbuffer = (WriteBuffer *) data;
  200|       |
  201|  25.8k|	for (;;) {
  202|       |		/* Wait to be told to write.
  203|       |		 */
  204|  25.8k|		vips_semaphore_down(&wbuffer->go);
  205|       |
  206|  25.8k|		if (wbuffer->kill)
  ------------------
  |  Branch (206:7): [True: 21.8k, False: 4.03k]
  ------------------
  207|  21.8k|			break;
  208|       |
  209|       |		/* Now block until the last worker finishes on this buffer.
  210|       |		 */
  211|  4.03k|		vips_semaphore_downn(&wbuffer->nwrite, 0);
  212|       |
  213|  4.03k|		wbuffer_write(wbuffer);
  214|       |
  215|       |		/* Signal write complete.
  216|       |		 */
  217|  4.03k|		vips_semaphore_up(&wbuffer->done);
  218|  4.03k|	}
  219|       |
  220|       |	/* We are exiting: tell the main thread.
  221|       |	 */
  222|  21.8k|	vips_semaphore_up(&wbuffer->finish);
  223|  21.8k|}
sinkdisc.c:wbuffer_write:
  180|  4.03k|{
  181|  4.03k|	Write *write = wbuffer->write;
  182|       |
  183|  4.03k|	VIPS_DEBUG_MSG("wbuffer_write: %d bytes from wbuffer %p\n",
  ------------------
  |  |   47|  4.03k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.03k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  4.03k|	{ \
  |  |   49|  4.03k|		; \
  |  |   50|  4.03k|	} \
  |  |   51|  4.03k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.03k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  184|  4.03k|		wbuffer->region->bpl * wbuffer->area.height, wbuffer);
  185|       |
  186|  4.03k|	VIPS_GATE_START("wbuffer_write: work");
  ------------------
  |  |   41|  4.03k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.03k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  4.03k|	{ \
  |  |   43|  4.03k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 4.03k]
  |  |  ------------------
  |  |   44|  4.03k|			vips__thread_gate_start(NAME); \
  |  |   45|  4.03k|	} \
  |  |   46|  4.03k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.03k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  187|       |
  188|  4.03k|	wbuffer->write_errno = write->write_fn(wbuffer->region,
  189|  4.03k|		&wbuffer->area, write->a);
  190|       |
  191|  4.03k|	VIPS_GATE_STOP("wbuffer_write: work");
  ------------------
  |  |   49|  4.03k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.03k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  4.03k|	{ \
  |  |   51|  4.03k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 4.03k]
  |  |  ------------------
  |  |   52|  4.03k|			vips__thread_gate_stop(NAME); \
  |  |   53|  4.03k|	} \
  |  |   54|  4.03k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.03k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|  4.03k|}
sinkdisc.c:wbuffer_position:
  291|  10.9k|{
  292|  10.9k|	VipsRect image, area;
  293|  10.9k|	int result;
  294|       |
  295|  10.9k|	image.left = 0;
  296|  10.9k|	image.top = 0;
  297|  10.9k|	image.width = wbuffer->write->sink_base.im->Xsize;
  298|  10.9k|	image.height = wbuffer->write->sink_base.im->Ysize;
  299|       |
  300|  10.9k|	area.left = 0;
  301|  10.9k|	area.top = top;
  302|  10.9k|	area.width = wbuffer->write->sink_base.im->Xsize;
  303|  10.9k|	area.height = height;
  304|       |
  305|  10.9k|	vips_rect_intersectrect(&area, &image, &wbuffer->area);
  306|       |
  307|       |	/* The workers take turns to move the buffers.
  308|       |	 */
  309|  10.9k|	vips__region_take_ownership(wbuffer->region);
  310|       |
  311|  10.9k|	result = vips_region_buffer(wbuffer->region, &wbuffer->area);
  312|       |
  313|  10.9k|	vips__region_no_ownership(wbuffer->region);
  314|       |
  315|       |	/* This should be an exclusive buffer, hopefully.
  316|       |	 */
  317|  10.9k|	if (!result)
  ------------------
  |  Branch (317:6): [True: 10.9k, False: 0]
  ------------------
  318|  10.9k|		g_assert(!wbuffer->region->buffer->done);
  ------------------
  |  |  166|  10.9k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  319|       |
  320|  10.9k|	return result;
  321|  10.9k|}
sinkdisc.c:write_thread_state_new:
  148|  10.9k|{
  149|  10.9k|	return VIPS_THREAD_STATE(vips_object_new(
  ------------------
  |  |   60|  10.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  10.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|  10.9k|		VIPS_TYPE_THREAD_STATE, VipsThreadState))
  ------------------
  150|  10.9k|		write_thread_state_get_type(),
  151|  10.9k|		vips_thread_state_set, im, a));
  152|  10.9k|}
sinkdisc.c:wbuffer_allocate_fn:
  330|  24.9k|{
  331|  24.9k|	WriteThreadState *wstate = (WriteThreadState *) state;
  332|  24.9k|	Write *write = (Write *) a;
  333|  24.9k|	SinkBase *sink_base = (SinkBase *) write;
  334|       |
  335|  24.9k|	VipsRect image;
  336|  24.9k|	VipsRect tile;
  337|       |
  338|  24.9k|	VIPS_DEBUG_MSG("wbuffer_allocate_fn:\n");
  ------------------
  |  |   47|  24.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  24.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  24.9k|	{ \
  |  |   49|  24.9k|		; \
  |  |   50|  24.9k|	} \
  |  |   51|  24.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  24.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  339|       |
  340|       |	/* Is the state x/y OK? New line or maybe new buffer or maybe even
  341|       |	 * all done.
  342|       |	 */
  343|  24.9k|	if (sink_base->x >= write->buf->area.width) {
  ------------------
  |  Branch (343:6): [True: 14.0k, False: 10.9k]
  ------------------
  344|  14.0k|		sink_base->x = 0;
  345|  14.0k|		sink_base->y += sink_base->tile_height;
  346|       |
  347|  14.0k|		if (sink_base->y >= VIPS_RECT_BOTTOM(&write->buf->area)) {
  ------------------
  |  |   49|  14.0k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  |  Branch (347:7): [True: 4.03k, False: 10.0k]
  ------------------
  348|  4.03k|			VIPS_DEBUG_MSG("wbuffer_allocate_fn: "
  ------------------
  |  |   47|  4.03k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.03k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  4.03k|	{ \
  |  |   49|  4.03k|		; \
  |  |   50|  4.03k|	} \
  |  |   51|  4.03k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.03k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  349|  4.03k|						   "finished top = %d, height = %d\n",
  350|  4.03k|				write->buf->area.top, write->buf->area.height);
  351|       |
  352|       |			/* Block until the write of the previous buffer
  353|       |			 * is done, then set write of this buffer going.
  354|       |			 */
  355|  4.03k|			if (wbuffer_flush(write)) {
  ------------------
  |  Branch (355:8): [True: 0, False: 4.03k]
  ------------------
  356|      0|				*stop = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  357|      0|				return -1;
  358|      0|			}
  359|       |
  360|       |			/* End of image?
  361|       |			 */
  362|  4.03k|			if (sink_base->y >= sink_base->im->Ysize) {
  ------------------
  |  Branch (362:8): [True: 4.03k, False: 0]
  ------------------
  363|  4.03k|				*stop = TRUE;
  ------------------
  |  |  798|  4.03k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  4.03k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  364|  4.03k|				return 0;
  365|  4.03k|			}
  366|       |
  367|  4.03k|			VIPS_DEBUG_MSG("wbuffer_allocate_fn: "
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|  4.03k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.03k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  368|      0|						   "starting top = %d, height = %d\n",
  369|      0|				sink_base->y, sink_base->n_lines);
  370|       |
  371|       |			/* Swap buffers.
  372|       |			 */
  373|      0|			VIPS_SWAP(WriteBuffer *, write->buf, write->buf_back);
  ------------------
  |  |  114|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |  115|      0|	{ \
  |  |  116|      0|		TYPE t = (A); \
  |  |  117|      0|		(A) = (B); \
  |  |  118|      0|		(B) = t; \
  |  |  119|      0|	} \
  |  |  120|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  374|       |
  375|       |			/* Position buf at the new y.
  376|       |			 */
  377|      0|			if (wbuffer_position(write->buf,
  ------------------
  |  Branch (377:8): [True: 0, False: 0]
  ------------------
  378|      0|					sink_base->y, sink_base->n_lines)) {
  379|      0|				*stop = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  380|      0|				return -1;
  381|      0|			}
  382|       |
  383|       |			/* This will be the first tile of a new buffer ... mark this as a
  384|       |			 * good place to stall for a moment if we want to stress the
  385|       |			 * caching system. See threadpool.c.
  386|       |			 */
  387|      0|            state->stall = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  388|      0|		}
  389|  14.0k|	}
  390|       |
  391|       |	/* x, y and buf are good: save params for thread.
  392|       |	 */
  393|  20.9k|	image.left = 0;
  394|  20.9k|	image.top = 0;
  395|  20.9k|	image.width = sink_base->im->Xsize;
  396|  20.9k|	image.height = sink_base->im->Ysize;
  397|  20.9k|	tile.left = sink_base->x;
  398|  20.9k|	tile.top = sink_base->y;
  399|  20.9k|	tile.width = sink_base->tile_width;
  400|  20.9k|	tile.height = sink_base->tile_height;
  401|  20.9k|	vips_rect_intersectrect(&image, &tile, &state->pos);
  402|       |
  403|       |	/* The thread needs to know which buffer it's writing to.
  404|       |	 */
  405|  20.9k|	wstate->buf = write->buf;
  406|       |
  407|  20.9k|	VIPS_DEBUG_MSG("  thread %p allocated "
  ------------------
  |  |   47|  20.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  20.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  20.9k|	{ \
  |  |   49|  20.9k|		; \
  |  |   50|  20.9k|	} \
  |  |   51|  20.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  20.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  408|  20.9k|				   "left = %d, top = %d, width = %d, height = %d\n",
  409|  20.9k|		g_thread_self(),
  410|  20.9k|		tile.left, tile.top, tile.width, tile.height);
  411|       |
  412|       |	/* Add to the number of writers on the buffer.
  413|       |	 */
  414|  20.9k|	vips_semaphore_upn(&write->buf->nwrite, -1);
  415|       |
  416|       |	/* Move state on.
  417|       |	 */
  418|  20.9k|	sink_base->x += sink_base->tile_width;
  419|       |
  420|       |	/* Add the number of pixels we've just allocated to progress.
  421|       |	 */
  422|  20.9k|	sink_base->processed += state->pos.width * state->pos.height;
  423|       |
  424|  20.9k|	return 0;
  425|  24.9k|}
sinkdisc.c:wbuffer_flush:
  267|  4.03k|{
  268|  4.03k|	VIPS_DEBUG_MSG("wbuffer_flush:\n");
  ------------------
  |  |   47|  4.03k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.03k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  4.03k|	{ \
  |  |   49|  4.03k|		; \
  |  |   50|  4.03k|	} \
  |  |   51|  4.03k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.03k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  269|       |
  270|       |	/* Block until the other buffer has been written. We have to do this
  271|       |	 * before we can set this buffer writing or we'll lose output ordering.
  272|       |	 */
  273|  4.03k|	if (write->buf->area.top > 0) {
  ------------------
  |  Branch (273:6): [True: 0, False: 4.03k]
  ------------------
  274|      0|		vips_semaphore_down(&write->buf_back->done);
  275|       |
  276|      0|		if (write_check_error(write))
  ------------------
  |  Branch (276:7): [True: 0, False: 0]
  ------------------
  277|      0|			return -1;
  278|      0|	}
  279|       |
  280|       |	/* Set the background writer going for this buffer.
  281|       |	 */
  282|  4.03k|	vips_semaphore_up(&write->buf->go);
  283|       |
  284|  4.03k|	return 0;
  285|  4.03k|}
sinkdisc.c:wbuffer_work_fn:
  431|  20.9k|{
  432|  20.9k|	WriteThreadState *wstate = (WriteThreadState *) state;
  433|       |
  434|  20.9k|	int result;
  435|       |
  436|  20.9k|	VIPS_DEBUG_MSG("wbuffer_work_fn: thread %p, %d x %d\n",
  ------------------
  |  |   47|  20.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  20.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  20.9k|	{ \
  |  |   49|  20.9k|		; \
  |  |   50|  20.9k|	} \
  |  |   51|  20.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  20.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  437|  20.9k|		g_thread_self(),
  438|  20.9k|		state->pos.left, state->pos.top);
  439|       |
  440|  20.9k|	result = vips_region_prepare_to(state->reg, wstate->buf->region,
  441|  20.9k|		&state->pos, state->pos.left, state->pos.top);
  442|       |
  443|  20.9k|	VIPS_DEBUG_MSG("wbuffer_work_fn: thread %p result = %d\n",
  ------------------
  |  |   47|  20.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  20.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  20.9k|	{ \
  |  |   49|  20.9k|		; \
  |  |   50|  20.9k|	} \
  |  |   51|  20.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  20.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  444|  20.9k|		g_thread_self(), result);
  445|       |
  446|       |	/* Tell the bg write thread we've left.
  447|       |	 */
  448|  20.9k|	vips_semaphore_upn(&wstate->buf->nwrite, 1);
  449|       |
  450|  20.9k|	return result;
  451|  20.9k|}
sinkdisc.c:write_check_error:
  103|  10.9k|{
  104|  10.9k|	if (write->buf->write_errno ||
  ------------------
  |  Branch (104:6): [True: 0, False: 10.9k]
  ------------------
  105|  10.9k|		write->buf_back->write_errno) {
  ------------------
  |  Branch (105:3): [True: 0, False: 10.9k]
  ------------------
  106|      0|		vips_error_system(write->buf->write_errno ?
  ------------------
  |  Branch (106:21): [True: 0, False: 0]
  ------------------
  107|      0|			write->buf->write_errno : write->buf_back->write_errno,
  108|      0|			"wbuffer_write", "%s", _("write failed"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  109|      0|		return -1;
  110|      0|	}
  111|       |
  112|  10.9k|	return 0;
  113|  10.9k|}
sinkdisc.c:write_free:
  467|  10.9k|{
  468|  10.9k|	VIPS_FREEF(wbuffer_free, write->buf);
  ------------------
  |  |   41|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  10.9k|	{ \
  |  |   43|  10.9k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 10.9k, False: 0]
  |  |  ------------------
  |  |   44|  10.9k|			(void) F((S)); \
  |  |   45|  10.9k|			(S) = 0; \
  |  |   46|  10.9k|		} \
  |  |   47|  10.9k|	} \
  |  |   48|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  469|  10.9k|	VIPS_FREEF(wbuffer_free, write->buf_back);
  ------------------
  |  |   41|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  10.9k|	{ \
  |  |   43|  10.9k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 10.9k, False: 0]
  |  |  ------------------
  |  |   44|  10.9k|			(void) F((S)); \
  |  |   45|  10.9k|			(S) = 0; \
  |  |   46|  10.9k|		} \
  |  |   47|  10.9k|	} \
  |  |   48|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  470|  10.9k|}

vips_sink_memory:
  325|  17.5k|{
  326|  17.5k|	SinkMemory memory;
  327|  17.5k|	int result;
  328|       |
  329|  17.5k|	if (sink_memory_init(&memory, image))
  ------------------
  |  Branch (329:6): [True: 0, False: 17.5k]
  ------------------
  330|      0|		return -1;
  331|       |
  332|  17.5k|	vips_image_preeval(image);
  333|       |
  334|  17.5k|	result = 0;
  335|  17.5k|	sink_memory_area_position(memory.area, 0, memory.sink_base.n_lines);
  336|  17.5k|	if (vips_threadpool_run(image,
  ------------------
  |  Branch (336:6): [True: 5.52k, False: 11.9k]
  ------------------
  337|  17.5k|			sink_memory_thread_state_new,
  338|  17.5k|			sink_memory_area_allocate_fn,
  339|  17.5k|			sink_memory_area_work_fn,
  340|  17.5k|			vips_sink_base_progress,
  341|  17.5k|			&memory))
  342|  5.52k|		result = -1;
  343|       |
  344|  17.5k|	vips_image_posteval(image);
  345|       |
  346|  17.5k|	sink_memory_free(&memory);
  347|       |
  348|  17.5k|	vips_image_minimise_all(image);
  349|       |
  350|  17.5k|	VIPS_DEBUG_MSG("vips_sink_memory: done\n");
  ------------------
  |  |   47|  17.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  17.5k|	{ \
  |  |   49|  17.5k|		; \
  |  |   50|  17.5k|	} \
  |  |   51|  17.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  351|       |
  352|  17.5k|	return result;
  353|  17.5k|}
sinkmemory.c:sink_memory_thread_state_class_init:
  105|      1|{
  106|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  107|       |
  108|      1|	object_class->nickname = "sinkmemorythreadstate";
  109|      1|	object_class->description = _("per-thread state for sinkmemory");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  110|      1|}
sinkmemory.c:sink_memory_thread_state_init:
  114|  17.5k|{
  115|  17.5k|}
sinkmemory.c:sink_memory_init:
  289|  17.5k|{
  290|  17.5k|	VipsRect all;
  291|       |
  292|  17.5k|	vips_sink_base_init(&memory->sink_base, image);
  293|  17.5k|	memory->area = NULL;
  294|  17.5k|	memory->old_area = NULL;
  295|       |
  296|  17.5k|	all.left = 0;
  297|  17.5k|	all.top = 0;
  298|  17.5k|	all.width = image->Xsize;
  299|  17.5k|	all.height = image->Ysize;
  300|       |
  301|  17.5k|	if (!(memory->region = vips_region_new(image)) ||
  ------------------
  |  Branch (301:6): [True: 0, False: 17.5k]
  ------------------
  302|  17.5k|		vips_region_image(memory->region, &all) ||
  ------------------
  |  Branch (302:3): [True: 0, False: 17.5k]
  ------------------
  303|  17.5k|		!(memory->area = sink_memory_area_new(memory)) ||
  ------------------
  |  Branch (303:3): [True: 0, False: 17.5k]
  ------------------
  304|  17.5k|		!(memory->old_area = sink_memory_area_new(memory))) {
  ------------------
  |  Branch (304:3): [True: 0, False: 17.5k]
  ------------------
  305|      0|		sink_memory_free(memory);
  306|      0|		return -1;
  307|      0|	}
  308|       |
  309|  17.5k|	return 0;
  310|  17.5k|}
sinkmemory.c:sink_memory_area_new:
  134|  35.0k|{
  135|  35.0k|	SinkMemoryArea *area;
  136|       |
  137|  35.0k|	if (!(area = VIPS_NEW(NULL, SinkMemoryArea)))
  ------------------
  |  |   70|  35.0k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  35.0k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  35.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  35.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  35.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (137:6): [True: 0, False: 35.0k]
  ------------------
  138|      0|		return NULL;
  139|  35.0k|	area->memory = memory;
  140|  35.0k|	vips_semaphore_init(&area->nwrite, 0, "nwrite");
  141|       |
  142|  35.0k|	return area;
  143|  35.0k|}
sinkmemory.c:sink_memory_area_position:
  149|  17.5k|{
  150|  17.5k|	SinkMemory *memory = area->memory;
  151|       |
  152|  17.5k|	VipsRect all, rect;
  153|       |
  154|  17.5k|	all.left = 0;
  155|  17.5k|	all.top = 0;
  156|  17.5k|	all.width = memory->sink_base.im->Xsize;
  157|  17.5k|	all.height = memory->sink_base.im->Ysize;
  158|       |
  159|  17.5k|	rect.left = 0;
  160|  17.5k|	rect.top = top;
  161|  17.5k|	rect.width = memory->sink_base.im->Xsize;
  162|  17.5k|	rect.height = height;
  163|       |
  164|  17.5k|	vips_rect_intersectrect(&all, &rect, &area->rect);
  165|  17.5k|}
sinkmemory.c:sink_memory_thread_state_new:
  119|  17.5k|{
  120|  17.5k|	return VIPS_THREAD_STATE(vips_object_new(
  ------------------
  |  |   60|  17.5k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  17.5k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  17.5k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|  17.5k|		VIPS_TYPE_THREAD_STATE, VipsThreadState))
  ------------------
  121|  17.5k|		sink_memory_thread_state_get_type(),
  122|  17.5k|		vips_thread_state_set, image, a));
  123|  17.5k|}
sinkmemory.c:sink_memory_area_allocate_fn:
  175|  39.8k|{
  176|  39.8k|	SinkMemoryThreadState *smstate = (SinkMemoryThreadState *) state;
  177|  39.8k|	SinkMemory *memory = (SinkMemory *) a;
  178|  39.8k|	SinkBase *sink_base = (SinkBase *) memory;
  179|       |
  180|  39.8k|	VipsRect image;
  181|  39.8k|	VipsRect tile;
  182|       |
  183|  39.8k|	VIPS_DEBUG_MSG("sink_memory_area_allocate_fn: %p\n", g_thread_self());
  ------------------
  |  |   47|  39.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  39.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  39.8k|	{ \
  |  |   49|  39.8k|		; \
  |  |   50|  39.8k|	} \
  |  |   51|  39.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  39.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  184|       |
  185|       |	/* Is the state x/y OK? New line or maybe new buffer or maybe even
  186|       |	 * all done.
  187|       |	 */
  188|  39.8k|	if (sink_base->x >= memory->area->rect.width) {
  ------------------
  |  Branch (188:6): [True: 22.3k, False: 17.5k]
  ------------------
  189|  22.3k|		sink_base->x = 0;
  190|  22.3k|		sink_base->y += sink_base->tile_height;
  191|       |
  192|  22.3k|		if (sink_base->y >= VIPS_RECT_BOTTOM(&memory->area->rect)) {
  ------------------
  |  |   49|  22.3k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  |  Branch (192:7): [True: 11.9k, False: 10.3k]
  ------------------
  193|       |			/* Block until the previous area is done.
  194|       |			 */
  195|  11.9k|			if (memory->area->rect.top > 0)
  ------------------
  |  Branch (195:8): [True: 0, False: 11.9k]
  ------------------
  196|      0|				vips_semaphore_downn(
  197|      0|					&memory->old_area->nwrite, 0);
  198|       |
  199|       |			/* End of image?
  200|       |			 */
  201|  11.9k|			if (sink_base->y >= sink_base->im->Ysize) {
  ------------------
  |  Branch (201:8): [True: 11.9k, False: 0]
  ------------------
  202|  11.9k|				*stop = TRUE;
  ------------------
  |  |  798|  11.9k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  11.9k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  203|  11.9k|				return 0;
  204|  11.9k|			}
  205|       |
  206|       |			/* Swap buffers.
  207|       |			 */
  208|  11.9k|			VIPS_SWAP(SinkMemoryArea *,
  ------------------
  |  |  114|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |  115|      0|	{ \
  |  |  116|      0|		TYPE t = (A); \
  |  |  117|      0|		(A) = (B); \
  |  |  118|      0|		(B) = t; \
  |  |  119|      0|	} \
  |  |  120|  11.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  11.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  209|      0|				memory->area, memory->old_area);
  210|       |
  211|       |			/* Position buf at the new y.
  212|       |			 */
  213|      0|			sink_memory_area_position(memory->area,
  214|      0|				sink_base->y, sink_base->n_lines);
  215|      0|		}
  216|  22.3k|	}
  217|       |
  218|       |	/* x, y and buf are good: save params for thread.
  219|       |	 */
  220|  27.8k|	image.left = 0;
  221|  27.8k|	image.top = 0;
  222|  27.8k|	image.width = sink_base->im->Xsize;
  223|  27.8k|	image.height = sink_base->im->Ysize;
  224|  27.8k|	tile.left = sink_base->x;
  225|  27.8k|	tile.top = sink_base->y;
  226|  27.8k|	tile.width = sink_base->tile_width;
  227|  27.8k|	tile.height = sink_base->tile_height;
  228|  27.8k|	vips_rect_intersectrect(&image, &tile, &state->pos);
  229|       |
  230|       |	/* The thread needs to know which area it's writing to.
  231|       |	 */
  232|  27.8k|	smstate->area = memory->area;
  233|       |
  234|  27.8k|	VIPS_DEBUG_MSG("  %p allocated %d x %d:\n",
  ------------------
  |  |   47|  27.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  27.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  27.8k|	{ \
  |  |   49|  27.8k|		; \
  |  |   50|  27.8k|	} \
  |  |   51|  27.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  27.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  235|  27.8k|		g_thread_self(), state->pos.left, state->pos.top);
  236|       |
  237|       |	/* Add to the number of writers on the area.
  238|       |	 */
  239|  27.8k|	vips_semaphore_upn(&memory->area->nwrite, -1);
  240|       |
  241|       |	/* Move state on.
  242|       |	 */
  243|  27.8k|	sink_base->x += sink_base->tile_width;
  244|       |
  245|       |	/* Add the number of pixels we've just allocated to progress.
  246|       |	 */
  247|  27.8k|	sink_base->processed += state->pos.width * state->pos.height;
  248|       |
  249|  27.8k|	return 0;
  250|  39.8k|}
sinkmemory.c:sink_memory_area_work_fn:
  256|  27.8k|{
  257|  27.8k|	SinkMemory *memory = (SinkMemory *) a;
  258|  27.8k|	SinkMemoryThreadState *smstate = (SinkMemoryThreadState *) state;
  259|  27.8k|	SinkMemoryArea *area = smstate->area;
  260|       |
  261|  27.8k|	int result;
  262|       |
  263|  27.8k|	VIPS_DEBUG_MSG("sink_memory_area_work_fn: %p %d x %d\n",
  ------------------
  |  |   47|  27.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  27.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  27.8k|	{ \
  |  |   49|  27.8k|		; \
  |  |   50|  27.8k|	} \
  |  |   51|  27.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  27.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  264|  27.8k|		g_thread_self(), state->pos.left, state->pos.top);
  265|       |
  266|  27.8k|	result = vips_region_prepare_to(state->reg, memory->region,
  267|  27.8k|		&state->pos, state->pos.left, state->pos.top);
  268|       |
  269|  27.8k|	VIPS_DEBUG_MSG("sink_memory_area_work_fn: %p result = %d\n",
  ------------------
  |  |   47|  27.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  27.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  27.8k|	{ \
  |  |   49|  27.8k|		; \
  |  |   50|  27.8k|	} \
  |  |   51|  27.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  27.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  270|  27.8k|		g_thread_self(), result);
  271|       |
  272|       |	/* Tell the allocator we're done.
  273|       |	 */
  274|  27.8k|	vips_semaphore_upn(&area->nwrite, 1);
  275|       |
  276|  27.8k|	return result;
  277|  27.8k|}
sinkmemory.c:sink_memory_free:
  281|  17.5k|{
  282|  17.5k|	VIPS_FREEF(sink_memory_area_free, memory->area);
  ------------------
  |  |   41|  17.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  17.5k|	{ \
  |  |   43|  17.5k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 17.5k, False: 0]
  |  |  ------------------
  |  |   44|  17.5k|			(void) F((S)); \
  |  |   45|  17.5k|			(S) = 0; \
  |  |   46|  17.5k|		} \
  |  |   47|  17.5k|	} \
  |  |   48|  17.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  283|  17.5k|	VIPS_FREEF(sink_memory_area_free, memory->old_area);
  ------------------
  |  |   41|  17.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  17.5k|	{ \
  |  |   43|  17.5k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 17.5k, False: 0]
  |  |  ------------------
  |  |   44|  17.5k|			(void) F((S)); \
  |  |   45|  17.5k|			(S) = 0; \
  |  |   46|  17.5k|		} \
  |  |   47|  17.5k|	} \
  |  |   48|  17.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  284|  17.5k|	VIPS_UNREF(memory->region);
  ------------------
  |  |   57|  17.5k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  17.5k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  17.5k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  17.5k|	{ \
  |  |  |  |   43|  17.5k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 17.5k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  17.5k|			(void) F((S)); \
  |  |  |  |   45|  17.5k|			(S) = 0; \
  |  |  |  |   46|  17.5k|		} \
  |  |  |  |   47|  17.5k|	} \
  |  |  |  |   48|  17.5k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  17.5k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  285|  17.5k|}
sinkmemory.c:sink_memory_area_free:
  127|  35.0k|{
  128|  35.0k|	vips_semaphore_destroy(&area->nwrite);
  129|  35.0k|	g_free(area);
  130|  35.0k|}

sinkscreen.c:render_thread_state_class_init:
  192|      1|{
  193|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  194|       |
  195|      1|	object_class->nickname = "renderthreadstate";
  196|      1|	object_class->description = _("per-thread state for render");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  197|      1|}

vips_source_new_from_blob:
  460|  89.3k|{
  461|  89.3k|	VipsSource *source;
  462|       |
  463|  89.3k|	VIPS_DEBUG_MSG("vips_source_new_from_blob: %p\n", blob);
  ------------------
  |  |   47|  89.3k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  89.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  89.3k|	{ \
  |  |   49|  89.3k|		; \
  |  |   50|  89.3k|	} \
  |  |   51|  89.3k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  89.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  464|       |
  465|  89.3k|	source = VIPS_SOURCE(g_object_new(VIPS_TYPE_SOURCE,
  ------------------
  |  |  106|  89.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  89.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  89.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|  89.3k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  466|  89.3k|		"blob", blob,
  467|  89.3k|		NULL));
  468|       |
  469|  89.3k|	if (vips_object_build(VIPS_OBJECT(source))) {
  ------------------
  |  |  433|  89.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  89.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  89.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (469:6): [True: 0, False: 89.3k]
  ------------------
  470|      0|		VIPS_UNREF(source);
  ------------------
  |  |   57|      0|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  471|      0|		return NULL;
  472|      0|	}
  473|       |
  474|  89.3k|	SANITY(source);
  475|       |
  476|  89.3k|	return source;
  477|  89.3k|}
vips_source_new_from_memory:
  532|  89.3k|{
  533|  89.3k|	VipsSource *source;
  534|  89.3k|	VipsBlob *blob;
  535|       |
  536|  89.3k|	VIPS_DEBUG_MSG("vips_source_new_from_buffer: %p, length = %zd\n",
  ------------------
  |  |   47|  89.3k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  89.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  89.3k|	{ \
  |  |   49|  89.3k|		; \
  |  |   50|  89.3k|	} \
  |  |   51|  89.3k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  89.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  537|  89.3k|		data, length);
  538|       |
  539|       |	/* We don't take a copy of the data or free it.
  540|       |	 */
  541|  89.3k|	blob = vips_blob_new(NULL, data, length);
  542|       |
  543|  89.3k|	source = vips_source_new_from_blob(blob);
  544|       |
  545|  89.3k|	vips_area_unref(VIPS_AREA(blob));
  ------------------
  |  |  137|  89.3k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  546|       |
  547|  89.3k|	SANITY(source);
  548|       |
  549|  89.3k|	return source;
  550|  89.3k|}
vips_source_minimise:
  593|  47.5k|{
  594|  47.5k|	VipsConnection *connection = VIPS_CONNECTION(source);
  ------------------
  |  |   48|  47.5k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  47.5k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  47.5k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|  47.5k|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  595|       |
  596|  47.5k|	SANITY(source);
  597|       |
  598|  47.5k|	(void) vips_source_test_features(source);
  599|       |
  600|  47.5k|	if (connection->filename &&
  ------------------
  |  Branch (600:6): [True: 0, False: 47.5k]
  ------------------
  601|  47.5k|		connection->descriptor != -1 &&
  ------------------
  |  Branch (601:3): [True: 0, False: 0]
  ------------------
  602|  47.5k|		connection->tracked_descriptor == connection->descriptor &&
  ------------------
  |  Branch (602:3): [True: 0, False: 0]
  ------------------
  603|  47.5k|		!source->is_pipe) {
  ------------------
  |  Branch (603:3): [True: 0, False: 0]
  ------------------
  604|       |#ifdef DEBUG_MINIMISE
  605|       |		printf("vips_source_minimise: %p %s\n",
  606|       |			source,
  607|       |			vips_connection_nick(VIPS_CONNECTION(source)));
  608|       |#endif /*DEBUG_MINIMISE*/
  609|       |
  610|      0|		vips_tracked_close(connection->tracked_descriptor);
  611|      0|		connection->tracked_descriptor = -1;
  612|      0|		connection->descriptor = -1;
  613|      0|	}
  614|       |
  615|  47.5k|	SANITY(source);
  616|  47.5k|}
vips_source_unminimise:
  631|  4.40M|{
  632|  4.40M|	VipsConnection *connection = VIPS_CONNECTION(source);
  ------------------
  |  |   48|  4.40M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  4.40M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  4.40M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|  4.40M|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  633|       |
  634|  4.40M|	if (connection->descriptor == -1 &&
  ------------------
  |  Branch (634:6): [True: 4.40M, False: 0]
  ------------------
  635|  4.40M|		connection->tracked_descriptor == -1 &&
  ------------------
  |  Branch (635:3): [True: 4.40M, False: 0]
  ------------------
  636|  4.40M|		connection->filename) {
  ------------------
  |  Branch (636:3): [True: 0, False: 4.40M]
  ------------------
  637|      0|		int fd;
  638|       |
  639|       |#ifdef DEBUG_MINIMISE
  640|       |		printf("vips_source_unminimise: %p %s\n",
  641|       |			source,
  642|       |			vips_connection_nick(VIPS_CONNECTION(source)));
  643|       |#endif /*DEBUG_MINIMISE*/
  644|       |
  645|      0|		if ((fd = vips_tracked_open(connection->filename,
  ------------------
  |  Branch (645:7): [True: 0, False: 0]
  ------------------
  646|      0|				 MODE_READ, 0)) == -1) {
  ------------------
  |  |   77|      0|#define MODE_READ CLOEXEC(BINARYIZE(O_RDONLY))
  |  |  ------------------
  |  |  |  |   68|      0|#define CLOEXEC(M) ((M) | O_CLOEXEC)
  |  |  ------------------
  ------------------
  647|      0|			vips_error_system(errno,
  648|      0|				vips_connection_nick(connection),
  649|      0|				"%s", _("unable to open for read"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  650|      0|			return -1;
  651|      0|		}
  652|       |
  653|      0|		connection->tracked_descriptor = fd;
  654|      0|		connection->descriptor = fd;
  655|       |
  656|      0|		if (vips_source_test_seek(source))
  ------------------
  |  Branch (656:7): [True: 0, False: 0]
  ------------------
  657|      0|			return -1;
  658|       |
  659|       |		/* It might be a named pipe.
  660|       |		 */
  661|      0|		if (!source->is_pipe) {
  ------------------
  |  Branch (661:7): [True: 0, False: 0]
  ------------------
  662|      0|			VIPS_DEBUG_MSG("vips_source_unminimise: restoring "
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  663|      0|						   "read position %" G_GINT64_FORMAT "\n",
  664|      0|				source->read_position);
  665|      0|			if (vips__seek(connection->descriptor,
  ------------------
  |  Branch (665:8): [True: 0, False: 0]
  ------------------
  666|      0|					source->read_position, SEEK_SET) == -1)
  667|      0|				return -1;
  668|      0|		}
  669|      0|	}
  670|       |
  671|  4.40M|	return 0;
  672|  4.40M|}
vips_source_decode:
  689|  2.65k|{
  690|  2.65k|	VIPS_DEBUG_MSG("vips_source_decode:\n");
  ------------------
  |  |   47|  2.65k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.65k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.65k|	{ \
  |  |   49|  2.65k|		; \
  |  |   50|  2.65k|	} \
  |  |   51|  2.65k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.65k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  691|       |
  692|  2.65k|	SANITY(source);
  693|       |
  694|  2.65k|	if (!source->decode) {
  ------------------
  |  Branch (694:6): [True: 2.65k, False: 0]
  ------------------
  695|  2.65k|		source->decode = TRUE;
  ------------------
  |  |  798|  2.65k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  2.65k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  696|       |
  697|  2.65k|		VIPS_FREEF(g_byte_array_unref, source->sniff);
  ------------------
  |  |   41|  2.65k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.65k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.65k|	{ \
  |  |   43|  2.65k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 2.65k, False: 0]
  |  |  ------------------
  |  |   44|  2.65k|			(void) F((S)); \
  |  |   45|  2.65k|			(S) = 0; \
  |  |   46|  2.65k|		} \
  |  |   47|  2.65k|	} \
  |  |   48|  2.65k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.65k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  698|       |
  699|       |		/* Now decode is set, header_bytes will be freed once it's
  700|       |		 * exhausted, see vips_source_read().
  701|       |		 */
  702|  2.65k|	}
  703|       |
  704|  2.65k|	vips_source_minimise(source);
  705|       |
  706|  2.65k|	SANITY(source);
  707|       |
  708|  2.65k|	return 0;
  709|  2.65k|}
vips_source_read:
  746|   755k|{
  747|   755k|	VipsSourceClass *class = VIPS_SOURCE_GET_CLASS(source);
  ------------------
  |  |  116|   755k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|   755k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   755k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  117|   755k|		VIPS_TYPE_SOURCE, VipsSourceClass))
  ------------------
  748|       |
  749|   755k|	gint64 total_read;
  750|       |
  751|   755k|	VIPS_DEBUG_MSG("vips_source_read:\n");
  ------------------
  |  |   47|   755k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   755k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   755k|	{ \
  |  |   49|   755k|		; \
  |  |   50|   755k|	} \
  |  |   51|   755k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   755k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  752|       |
  753|   755k|	SANITY(source);
  754|       |
  755|   755k|	if (vips_source_unminimise(source) ||
  ------------------
  |  Branch (755:6): [True: 0, False: 755k]
  ------------------
  756|   755k|		vips_source_test_features(source))
  ------------------
  |  Branch (756:3): [True: 0, False: 755k]
  ------------------
  757|      0|		return -1;
  758|       |
  759|   755k|	total_read = 0;
  760|       |
  761|   755k|	if (source->data) {
  ------------------
  |  Branch (761:6): [True: 755k, False: 0]
  ------------------
  762|       |		/* The whole thing is in memory somehow.
  763|       |		 */
  764|   755k|		gint64 available = VIPS_MIN(length,
  ------------------
  |  |   55|   755k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 720k, False: 34.5k]
  |  |  ------------------
  ------------------
  765|   755k|			source->length - source->read_position);
  766|       |
  767|   755k|		VIPS_DEBUG_MSG("    %zd bytes from memory\n", available);
  ------------------
  |  |   47|   755k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   755k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   755k|	{ \
  |  |   49|   755k|		; \
  |  |   50|   755k|	} \
  |  |   51|   755k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   755k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  768|   755k|		memcpy(buffer,
  769|   755k|			(char *) source->data + source->read_position, available);
  770|   755k|		source->read_position += available;
  771|   755k|		total_read += available;
  772|   755k|	}
  773|      0|	else {
  774|       |		/* Some kind of filesystem or custom source.
  775|       |		 *
  776|       |		 * Get what we can from header_bytes. We may need to read
  777|       |		 * some more after this.
  778|       |		 */
  779|      0|		if (source->header_bytes &&
  ------------------
  |  Branch (779:7): [True: 0, False: 0]
  ------------------
  780|      0|			source->read_position < source->header_bytes->len) {
  ------------------
  |  Branch (780:4): [True: 0, False: 0]
  ------------------
  781|      0|			gint64 available = VIPS_MIN(length,
  ------------------
  |  |   55|      0|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  782|      0|				source->header_bytes->len - source->read_position);
  783|       |
  784|      0|			VIPS_DEBUG_MSG("    %zd bytes from cache\n", available);
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  785|      0|			memcpy(buffer,
  786|      0|				source->header_bytes->data + source->read_position, available);
  787|      0|			source->read_position += available;
  788|      0|			buffer = (char *) buffer + available;
  789|      0|			length -= available;
  790|      0|			total_read += available;
  791|      0|		}
  792|       |
  793|       |		/* We're in pixel decode mode and we've exhausted the header
  794|       |		 * cache. We can safely junk it.
  795|       |		 */
  796|      0|		if (source->decode &&
  ------------------
  |  Branch (796:7): [True: 0, False: 0]
  ------------------
  797|      0|			source->header_bytes &&
  ------------------
  |  Branch (797:4): [True: 0, False: 0]
  ------------------
  798|      0|			source->read_position >= source->header_bytes->len)
  ------------------
  |  Branch (798:4): [True: 0, False: 0]
  ------------------
  799|      0|			VIPS_FREEF(g_byte_array_unref, source->header_bytes);
  ------------------
  |  |   41|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|      0|	{ \
  |  |   43|      0|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|      0|	} \
  |  |   48|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  800|       |
  801|       |		/* Any more bytes requested? Call the read() vfunc.
  802|       |		 */
  803|      0|		if (length > 0) {
  ------------------
  |  Branch (803:7): [True: 0, False: 0]
  ------------------
  804|      0|			gint64 bytes_read;
  805|       |
  806|      0|			VIPS_DEBUG_MSG("    calling class->read()\n");
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  807|      0|			bytes_read = class->read(source, buffer, length);
  808|      0|			VIPS_DEBUG_MSG("    %zd bytes from read()\n", bytes_read);
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  809|      0|			if (bytes_read == -1) {
  ------------------
  |  Branch (809:8): [True: 0, False: 0]
  ------------------
  810|      0|				vips_error_system(errno,
  811|      0|					vips_connection_nick(VIPS_CONNECTION(source)),
  ------------------
  |  |   48|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|      0|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  812|      0|					"%s", _("read error"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  813|      0|				return -1;
  814|      0|			}
  815|       |
  816|       |			/* We need to save bytes if we're in header mode and
  817|       |			 * we can't seek or map.
  818|       |			 */
  819|      0|			if (source->header_bytes &&
  ------------------
  |  Branch (819:8): [True: 0, False: 0]
  ------------------
  820|      0|				source->is_pipe &&
  ------------------
  |  Branch (820:5): [True: 0, False: 0]
  ------------------
  821|      0|				!source->decode &&
  ------------------
  |  Branch (821:5): [True: 0, False: 0]
  ------------------
  822|      0|				bytes_read > 0)
  ------------------
  |  Branch (822:5): [True: 0, False: 0]
  ------------------
  823|      0|				g_byte_array_append(source->header_bytes, buffer, bytes_read);
  824|       |
  825|      0|			source->read_position += bytes_read;
  826|      0|			total_read += bytes_read;
  827|      0|		}
  828|      0|	}
  829|       |
  830|   755k|	VIPS_DEBUG_MSG("    %zd bytes total\n", total_read);
  ------------------
  |  |   47|   755k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   755k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   755k|	{ \
  |  |   49|   755k|		; \
  |  |   50|   755k|	} \
  |  |   51|   755k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   755k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  831|       |
  832|   755k|	SANITY(source);
  833|       |
  834|   755k|	return total_read;
  835|   755k|}
vips_source_is_mappable:
  990|  5.35k|{
  991|  5.35k|	if (vips_source_unminimise(source) ||
  ------------------
  |  Branch (991:6): [True: 0, False: 5.35k]
  ------------------
  992|  5.35k|		vips_source_test_features(source))
  ------------------
  |  Branch (992:3): [True: 0, False: 5.35k]
  ------------------
  993|      0|		return -1;
  994|       |
  995|       |	/* Already a memory object, or there's a filename we can map, or
  996|       |	 * there's a seekable descriptor.
  997|       |	 */
  998|  5.35k|	return source->data ||
  ------------------
  |  Branch (998:9): [True: 5.35k, False: 0]
  ------------------
  999|  5.35k|		VIPS_CONNECTION(source)->filename ||
  ------------------
  |  |   48|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|      0|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  |  Branch (999:3): [True: 0, False: 0]
  ------------------
 1000|  5.35k|		(!source->is_pipe &&
  ------------------
  |  Branch (1000:4): [True: 0, False: 0]
  ------------------
 1001|      0|			VIPS_CONNECTION(source)->descriptor != -1);
  ------------------
  |  |   48|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|      0|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  |  Branch (1001:4): [True: 0, False: 0]
  ------------------
 1002|  5.35k|}
vips_source_map:
 1047|  7.32k|{
 1048|  7.32k|	VIPS_DEBUG_MSG("vips_source_map:\n");
  ------------------
  |  |   47|  7.32k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  7.32k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  7.32k|	{ \
  |  |   49|  7.32k|		; \
  |  |   50|  7.32k|	} \
  |  |   51|  7.32k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.32k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1049|       |
 1050|  7.32k|	SANITY(source);
 1051|       |
 1052|  7.32k|	if (vips_source_unminimise(source) ||
  ------------------
  |  Branch (1052:6): [True: 0, False: 7.32k]
  ------------------
 1053|  7.32k|		vips_source_test_features(source))
  ------------------
  |  Branch (1053:3): [True: 0, False: 7.32k]
  ------------------
 1054|      0|		return NULL;
 1055|       |
 1056|       |	/* Try to map the file into memory, if possible. Some filesystems have
 1057|       |	 * mmap disabled, so we don't give up if this fails.
 1058|       |	 */
 1059|  7.32k|	if (!source->data &&
  ------------------
  |  Branch (1059:6): [True: 0, False: 7.32k]
  ------------------
 1060|  7.32k|		vips_source_is_mappable(source))
  ------------------
  |  Branch (1060:3): [True: 0, False: 0]
  ------------------
 1061|      0|		(void) vips_source_descriptor_to_memory(source);
 1062|       |
 1063|       |	/* If it's not a pipe, we can rewind, get the length, and read the
 1064|       |	 * whole thing.
 1065|       |	 */
 1066|  7.32k|	if (!source->data &&
  ------------------
  |  Branch (1066:6): [True: 0, False: 7.32k]
  ------------------
 1067|  7.32k|		!source->is_pipe &&
  ------------------
  |  Branch (1067:3): [True: 0, False: 0]
  ------------------
 1068|  7.32k|		vips_source_read_to_memory(source))
  ------------------
  |  Branch (1068:3): [True: 0, False: 0]
  ------------------
 1069|      0|		return NULL;
 1070|       |
 1071|       |	/* We don't know the length and must read and assemble in chunks.
 1072|       |	 */
 1073|  7.32k|	if (source->is_pipe &&
  ------------------
  |  Branch (1073:6): [True: 0, False: 7.32k]
  ------------------
 1074|  7.32k|		vips_source_pipe_read_to_position(source, -1))
  ------------------
  |  Branch (1074:3): [True: 0, False: 0]
  ------------------
 1075|      0|		return NULL;
 1076|       |
 1077|  7.32k|	if (length_out)
  ------------------
  |  Branch (1077:6): [True: 7.32k, False: 0]
  ------------------
 1078|  7.32k|		*length_out = source->length;
 1079|       |
 1080|  7.32k|	SANITY(source);
 1081|       |
 1082|  7.32k|	return source->data;
 1083|  7.32k|}
vips_source_seek:
 1136|  1.22M|{
 1137|  1.22M|	const char *nick = vips_connection_nick(VIPS_CONNECTION(source));
  ------------------
  |  |   48|  1.22M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  1.22M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.22M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|  1.22M|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
 1138|  1.22M|	VipsSourceClass *class = VIPS_SOURCE_GET_CLASS(source);
  ------------------
  |  |  116|  1.22M|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  1.22M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  1.22M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  117|  1.22M|		VIPS_TYPE_SOURCE, VipsSourceClass))
  ------------------
 1139|       |
 1140|  1.22M|	gint64 new_pos;
 1141|       |
 1142|  1.22M|	VIPS_DEBUG_MSG(
  ------------------
  |  |   47|  1.22M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.22M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  1.22M|	{ \
  |  |   49|  1.22M|		; \
  |  |   50|  1.22M|	} \
  |  |   51|  1.22M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.22M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1143|  1.22M|		"vips_source_seek: offset = %" G_GINT64_FORMAT ", whence = %d\n",
 1144|  1.22M|		offset, whence);
 1145|       |
 1146|  1.22M|	if (vips_source_unminimise(source) ||
  ------------------
  |  Branch (1146:6): [True: 0, False: 1.22M]
  ------------------
 1147|  1.22M|		vips_source_test_features(source))
  ------------------
  |  Branch (1147:3): [True: 0, False: 1.22M]
  ------------------
 1148|      0|		return -1;
 1149|       |
 1150|  1.22M|	if (source->data) {
  ------------------
  |  Branch (1150:6): [True: 1.22M, False: 0]
  ------------------
 1151|  1.22M|		switch (whence) {
 1152|   743k|		case SEEK_SET:
  ------------------
  |  Branch (1152:3): [True: 743k, False: 484k]
  ------------------
 1153|   743k|			new_pos = offset;
 1154|   743k|			break;
 1155|       |
 1156|   366k|		case SEEK_CUR:
  ------------------
  |  Branch (1156:3): [True: 366k, False: 862k]
  ------------------
 1157|   366k|			new_pos = source->read_position + offset;
 1158|   366k|			break;
 1159|       |
 1160|   118k|		case SEEK_END:
  ------------------
  |  Branch (1160:3): [True: 118k, False: 1.10M]
  ------------------
 1161|   118k|			new_pos = source->length + offset;
 1162|   118k|			break;
 1163|       |
 1164|      0|		default:
  ------------------
  |  Branch (1164:3): [True: 0, False: 1.22M]
  ------------------
 1165|      0|			vips_error(nick, "%s", _("bad 'whence'"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1166|      0|			return -1;
 1167|  1.22M|		}
 1168|  1.22M|	}
 1169|      0|	else if (source->is_pipe) {
  ------------------
  |  Branch (1169:11): [True: 0, False: 0]
  ------------------
 1170|      0|		switch (whence) {
 1171|      0|		case SEEK_SET:
  ------------------
  |  Branch (1171:3): [True: 0, False: 0]
  ------------------
 1172|      0|			new_pos = offset;
 1173|      0|			break;
 1174|       |
 1175|      0|		case SEEK_CUR:
  ------------------
  |  Branch (1175:3): [True: 0, False: 0]
  ------------------
 1176|      0|			new_pos = source->read_position + offset;
 1177|      0|			break;
 1178|       |
 1179|      0|		case SEEK_END:
  ------------------
  |  Branch (1179:3): [True: 0, False: 0]
  ------------------
 1180|       |			/* We have to read the whole source into memory to get
 1181|       |			 * the length.
 1182|       |			 */
 1183|      0|			if (vips_source_pipe_read_to_position(source, -1))
  ------------------
  |  Branch (1183:8): [True: 0, False: 0]
  ------------------
 1184|      0|				return -1;
 1185|       |
 1186|      0|			new_pos = source->length + offset;
 1187|      0|			break;
 1188|       |
 1189|      0|		default:
  ------------------
  |  Branch (1189:3): [True: 0, False: 0]
  ------------------
 1190|      0|			vips_error(nick, "%s", _("bad 'whence'"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1191|      0|			return -1;
 1192|      0|		}
 1193|      0|	}
 1194|      0|	else {
 1195|      0|		if ((new_pos = class->seek(source, offset, whence)) == -1)
  ------------------
  |  Branch (1195:7): [True: 0, False: 0]
  ------------------
 1196|      0|			return -1;
 1197|      0|	}
 1198|       |
 1199|       |	/* For pipes, we have to fake seek by reading to that point. This
 1200|       |	 * might hit EOF and turn the pipe into a memory source.
 1201|       |	 */
 1202|  1.22M|	if (source->is_pipe &&
  ------------------
  |  Branch (1202:6): [True: 0, False: 1.22M]
  ------------------
 1203|  1.22M|		vips_source_pipe_read_to_position(source, new_pos))
  ------------------
  |  Branch (1203:3): [True: 0, False: 0]
  ------------------
 1204|      0|		return -1;
 1205|       |
 1206|       |	/* Don't allow out of range seeks.
 1207|       |	 */
 1208|  1.22M|	if (new_pos < 0 ||
  ------------------
  |  Branch (1208:6): [True: 262, False: 1.22M]
  ------------------
 1209|  1.22M|		(source->length != -1 && new_pos > source->length)) {
  ------------------
  |  Branch (1209:4): [True: 1.22M, False: 0]
  |  Branch (1209:28): [True: 59.8k, False: 1.16M]
  ------------------
 1210|  60.0k|		vips_error(nick,
 1211|  60.0k|			_("bad seek to %" G_GINT64_FORMAT), new_pos);
  ------------------
  |  |   30|  60.0k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  60.0k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1212|  60.0k|		return -1;
 1213|  60.0k|	}
 1214|       |
 1215|  1.16M|	source->read_position = new_pos;
 1216|       |
 1217|  1.16M|	VIPS_DEBUG_MSG("    new_pos = %" G_GINT64_FORMAT "\n", new_pos);
  ------------------
  |  |   47|  1.16M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.16M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  1.16M|	{ \
  |  |   49|  1.16M|		; \
  |  |   50|  1.16M|	} \
  |  |   51|  1.16M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.16M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1218|       |
 1219|  1.16M|	return new_pos;
 1220|  1.22M|}
vips_source_rewind:
 1235|   105k|{
 1236|   105k|	VIPS_DEBUG_MSG("vips_source_rewind:\n");
  ------------------
  |  |   47|   105k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   105k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   105k|	{ \
  |  |   49|   105k|		; \
  |  |   50|   105k|	} \
  |  |   51|   105k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   105k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1237|       |
 1238|   105k|	SANITY(source);
 1239|       |
 1240|   105k|	if (vips_source_test_features(source) ||
  ------------------
  |  Branch (1240:6): [True: 0, False: 105k]
  ------------------
 1241|   105k|		vips_source_seek(source, 0, SEEK_SET) != 0)
  ------------------
  |  Branch (1241:3): [True: 0, False: 105k]
  ------------------
 1242|      0|		return -1;
 1243|       |
 1244|       |	/* Back into sniff + header decode state.
 1245|       |	 */
 1246|   105k|	source->decode = FALSE;
  ------------------
  |  |  794|   105k|#define	FALSE	(0)
  ------------------
 1247|   105k|	if (!source->sniff)
  ------------------
  |  Branch (1247:6): [True: 0, False: 105k]
  ------------------
 1248|      0|		source->sniff = g_byte_array_new();
 1249|       |
 1250|   105k|	SANITY(source);
 1251|       |
 1252|   105k|	return 0;
 1253|   105k|}
vips_source_length:
 1267|   118k|{
 1268|   118k|	gint64 length;
 1269|   118k|	gint64 read_position;
 1270|       |
 1271|   118k|	VIPS_DEBUG_MSG("vips_source_length:\n");
  ------------------
  |  |   47|   118k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   118k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   118k|	{ \
  |  |   49|   118k|		; \
  |  |   50|   118k|	} \
  |  |   51|   118k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   118k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1272|       |
 1273|   118k|	if (vips_source_test_features(source))
  ------------------
  |  Branch (1273:6): [True: 0, False: 118k]
  ------------------
 1274|      0|		return -1;
 1275|       |
 1276|   118k|	read_position = vips_source_seek(source, 0, SEEK_CUR);
 1277|   118k|	length = vips_source_seek(source, 0, SEEK_END);
 1278|   118k|	vips_source_seek(source, read_position, SEEK_SET);
 1279|       |
 1280|   118k|	return length;
 1281|   118k|}
vips_source_sniff_at_most:
 1299|  68.2k|{
 1300|  68.2k|	unsigned char *q;
 1301|  68.2k|	gint64 read_position;
 1302|       |
 1303|  68.2k|	VIPS_DEBUG_MSG("vips_source_sniff_at_most: %zd bytes\n", length);
  ------------------
  |  |   47|  68.2k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  68.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  68.2k|	{ \
  |  |   49|  68.2k|		; \
  |  |   50|  68.2k|	} \
  |  |   51|  68.2k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  68.2k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1304|       |
 1305|  68.2k|	SANITY(source);
 1306|       |
 1307|  68.2k|	if (vips_source_test_features(source) ||
  ------------------
  |  Branch (1307:6): [True: 0, False: 68.2k]
  ------------------
 1308|  68.2k|		vips_source_rewind(source))
  ------------------
  |  Branch (1308:3): [True: 0, False: 68.2k]
  ------------------
 1309|      0|		return -1;
 1310|       |
 1311|  68.2k|	g_byte_array_set_size(source->sniff, length);
 1312|       |
 1313|  68.2k|	read_position = 0;
 1314|  68.2k|	q = source->sniff->data;
 1315|   136k|	while (read_position < length) {
  ------------------
  |  Branch (1315:9): [True: 68.4k, False: 67.9k]
  ------------------
 1316|  68.4k|		gint64 bytes_read;
 1317|       |
 1318|  68.4k|		bytes_read = vips_source_read(source, q, length - read_position);
 1319|  68.4k|		if (bytes_read == -1)
  ------------------
  |  Branch (1319:7): [True: 0, False: 68.4k]
  ------------------
 1320|      0|			return -1;
 1321|  68.4k|		if (bytes_read == 0)
  ------------------
  |  Branch (1321:7): [True: 228, False: 68.2k]
  ------------------
 1322|    228|			break;
 1323|       |
 1324|  68.2k|		read_position += bytes_read;
 1325|  68.2k|		q += bytes_read;
 1326|  68.2k|	}
 1327|       |
 1328|  68.2k|	SANITY(source);
 1329|       |
 1330|  68.2k|	*data = source->sniff->data;
 1331|       |
 1332|  68.2k|	return read_position;
 1333|  68.2k|}
vips_source_sniff:
 1347|  68.2k|{
 1348|  68.2k|	unsigned char *data;
 1349|  68.2k|	gint64 bytes_read;
 1350|       |
 1351|  68.2k|	if (vips_source_test_features(source))
  ------------------
  |  Branch (1351:6): [True: 0, False: 68.2k]
  ------------------
 1352|      0|		return NULL;
 1353|       |
 1354|  68.2k|	bytes_read = vips_source_sniff_at_most(source, &data, length);
 1355|  68.2k|	if (bytes_read == -1)
  ------------------
  |  Branch (1355:6): [True: 0, False: 68.2k]
  ------------------
 1356|      0|		return NULL;
 1357|  68.2k|	if (bytes_read < length)
  ------------------
  |  Branch (1357:6): [True: 228, False: 67.9k]
  ------------------
 1358|    228|		return NULL;
 1359|       |
 1360|  67.9k|	return data;
 1361|  68.2k|}
source.c:vips_source_class_init:
  349|      1|{
  350|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  351|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  352|       |
  353|      1|	gobject_class->finalize = vips_source_finalize;
  354|      1|	gobject_class->set_property = vips_object_set_property;
  355|      1|	gobject_class->get_property = vips_object_get_property;
  356|       |
  357|      1|	object_class->nickname = "source";
  358|      1|	object_class->description = _("input source");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  359|       |
  360|      1|	object_class->build = vips_source_build;
  361|       |
  362|      1|	class->read = vips_source_read_real;
  363|      1|	class->seek = vips_source_seek_real;
  364|       |
  365|      1|	VIPS_ARG_BOXED(class, "blob", 3,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  366|      1|		_("Blob"),
  367|      1|		_("Blob to load from"),
  368|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  369|      1|		G_STRUCT_OFFSET(VipsSource, blob),
  370|      1|		VIPS_TYPE_BLOB);
  371|      1|}
source.c:vips_source_finalize:
  250|  89.3k|{
  251|  89.3k|	VipsSource *source = VIPS_SOURCE(gobject);
  ------------------
  |  |  106|  89.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  89.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  89.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|  89.3k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  252|       |
  253|       |#ifdef DEBUG_MINIMISE
  254|       |	printf("vips_source_finalize: %p\n", source);
  255|       |#endif /*DEBUG_MINIMISE*/
  256|       |
  257|  89.3k|	VIPS_FREEF(g_byte_array_unref, source->header_bytes);
  ------------------
  |  |   41|  89.3k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  89.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  89.3k|	{ \
  |  |   43|  89.3k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 89.3k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  89.3k|	} \
  |  |   48|  89.3k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  89.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  258|  89.3k|	VIPS_FREEF(g_byte_array_unref, source->sniff);
  ------------------
  |  |   41|  89.3k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  89.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  89.3k|	{ \
  |  |   43|  89.3k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 86.6k, False: 2.65k]
  |  |  ------------------
  |  |   44|  86.6k|			(void) F((S)); \
  |  |   45|  86.6k|			(S) = 0; \
  |  |   46|  86.6k|		} \
  |  |   47|  89.3k|	} \
  |  |   48|  89.3k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  89.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  259|  89.3k|	if (source->mmap_baseaddr) {
  ------------------
  |  Branch (259:6): [True: 0, False: 89.3k]
  ------------------
  260|      0|		vips__munmap(source->mmap_baseaddr, source->mmap_length);
  261|      0|		source->mmap_baseaddr = NULL;
  262|      0|	}
  263|       |
  264|  89.3k|	G_OBJECT_CLASS(vips_source_parent_class)->finalize(gobject);
  ------------------
  |  |   58|  89.3k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  89.3k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  89.3k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  265|  89.3k|}
source.c:vips_source_build:
  269|  89.3k|{
  270|  89.3k|	VipsConnection *connection = VIPS_CONNECTION(object);
  ------------------
  |  |   48|  89.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  89.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  89.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|  89.3k|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  271|  89.3k|	VipsSource *source = VIPS_SOURCE(object);
  ------------------
  |  |  106|  89.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  89.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  89.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|  89.3k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  272|       |
  273|  89.3k|	VIPS_DEBUG_MSG("vips_source_build: %p\n", source);
  ------------------
  |  |   47|  89.3k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  89.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  89.3k|	{ \
  |  |   49|  89.3k|		; \
  |  |   50|  89.3k|	} \
  |  |   51|  89.3k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  89.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  274|       |
  275|  89.3k|	if (VIPS_OBJECT_CLASS(vips_source_parent_class)->build(object))
  ------------------
  |  |  435|  89.3k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  89.3k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  89.3k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (275:6): [True: 0, False: 89.3k]
  ------------------
  276|      0|		return -1;
  277|       |
  278|  89.3k|	if (vips_object_argument_isset(object, "filename") &&
  ------------------
  |  Branch (278:6): [True: 0, False: 89.3k]
  ------------------
  279|  89.3k|		vips_object_argument_isset(object, "descriptor")) {
  ------------------
  |  Branch (279:3): [True: 0, False: 0]
  ------------------
  280|      0|		vips_error(vips_connection_nick(connection),
  281|      0|			"%s", _("don't set 'filename' and 'descriptor'"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  282|      0|		return -1;
  283|      0|	}
  284|       |
  285|       |	/* unminimise will open the filename.
  286|       |	 */
  287|  89.3k|	if (vips_object_argument_isset(object, "filename") &&
  ------------------
  |  Branch (287:6): [True: 0, False: 89.3k]
  ------------------
  288|  89.3k|		vips_source_unminimise(source))
  ------------------
  |  Branch (288:3): [True: 0, False: 0]
  ------------------
  289|      0|		return -1;
  290|       |
  291|  89.3k|	if (vips_object_argument_isset(object, "descriptor")) {
  ------------------
  |  Branch (291:6): [True: 0, False: 89.3k]
  ------------------
  292|      0|		connection->descriptor = dup(connection->descriptor);
  293|      0|		connection->close_descriptor = connection->descriptor;
  294|       |
  295|       |#ifdef G_OS_WIN32
  296|       |		/* Windows will create eg. stdin and stdout in text mode.
  297|       |		 * We always read in binary mode.
  298|       |		 */
  299|       |		_setmode(connection->descriptor, _O_BINARY);
  300|       |#endif /*G_OS_WIN32*/
  301|      0|	}
  302|       |
  303|  89.3k|	if (vips_object_argument_isset(object, "blob")) {
  ------------------
  |  Branch (303:6): [True: 89.3k, False: 0]
  ------------------
  304|  89.3k|		size_t length;
  305|       |
  306|  89.3k|		if (!(source->data = vips_blob_get(source->blob, &length)))
  ------------------
  |  Branch (306:7): [True: 0, False: 89.3k]
  ------------------
  307|      0|			return -1;
  308|       |
  309|  89.3k|		source->length = VIPS_MIN(length, G_MAXSSIZE);
  ------------------
  |  |   55|  89.3k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 89.3k, False: 0]
  |  |  ------------------
  ------------------
  310|  89.3k|	}
  311|       |
  312|  89.3k|	return 0;
  313|  89.3k|}
source.c:vips_source_init:
  375|  89.3k|{
  376|  89.3k|	source->length = -1;
  377|  89.3k|	source->sniff = g_byte_array_new();
  378|  89.3k|	source->header_bytes = g_byte_array_new();
  379|  89.3k|}
source.c:vips_source_test_features:
  163|  2.40M|{
  164|  2.40M|	if (vips_source_unminimise(source) ||
  ------------------
  |  Branch (164:6): [True: 0, False: 2.40M]
  ------------------
  165|  2.40M|		vips_source_test_seek(source))
  ------------------
  |  Branch (165:3): [True: 0, False: 2.40M]
  ------------------
  166|      0|		return -1;
  167|       |
  168|  2.40M|	return 0;
  169|  2.40M|}
source.c:vips_source_test_seek:
  115|  2.40M|{
  116|  2.40M|	if (!source->have_tested_seek) {
  ------------------
  |  Branch (116:6): [True: 89.3k, False: 2.31M]
  ------------------
  117|  89.3k|		VipsSourceClass *class = VIPS_SOURCE_GET_CLASS(source);
  ------------------
  |  |  116|  89.3k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  89.3k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  89.3k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  117|  89.3k|		VIPS_TYPE_SOURCE, VipsSourceClass))
  ------------------
  118|       |
  119|  89.3k|		source->have_tested_seek = TRUE;
  ------------------
  |  |  798|  89.3k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  89.3k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  120|       |
  121|  89.3k|		VIPS_DEBUG_MSG("vips_source_can_seek: testing seek ..\n");
  ------------------
  |  |   47|  89.3k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  89.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  89.3k|	{ \
  |  |   49|  89.3k|		; \
  |  |   50|  89.3k|	} \
  |  |   51|  89.3k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  89.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  122|       |
  123|       |		/* Can we seek this input?
  124|       |		 *
  125|       |		 * We need to call the method directly rather than via
  126|       |		 * vips_source_seek() etc. or we might trigger seek emulation.
  127|       |		 */
  128|  89.3k|		if (source->data ||
  ------------------
  |  Branch (128:7): [True: 89.3k, False: 0]
  ------------------
  129|  89.3k|			class->seek(source, 0, SEEK_CUR) != -1) {
  ------------------
  |  Branch (129:4): [True: 0, False: 0]
  ------------------
  130|  89.3k|			gint64 length;
  131|       |
  132|  89.3k|			VIPS_DEBUG_MSG("    seekable source\n");
  ------------------
  |  |   47|  89.3k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  89.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  89.3k|	{ \
  |  |   49|  89.3k|		; \
  |  |   50|  89.3k|	} \
  |  |   51|  89.3k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  89.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  133|       |
  134|       |			/* We should be able to get the length of seekable
  135|       |			 * objects.
  136|       |			 */
  137|  89.3k|			if ((length = vips_source_length(source)) == -1)
  ------------------
  |  Branch (137:8): [True: 0, False: 89.3k]
  ------------------
  138|      0|				return -1;
  139|       |
  140|  89.3k|			source->length = length;
  141|       |
  142|       |			/* If we can seek, we won't need to save header bytes.
  143|       |			 */
  144|  89.3k|			VIPS_FREEF(g_byte_array_unref, source->header_bytes);
  ------------------
  |  |   41|  89.3k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  89.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  89.3k|	{ \
  |  |   43|  89.3k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 89.3k, False: 0]
  |  |  ------------------
  |  |   44|  89.3k|			(void) F((S)); \
  |  |   45|  89.3k|			(S) = 0; \
  |  |   46|  89.3k|		} \
  |  |   47|  89.3k|	} \
  |  |   48|  89.3k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  89.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  145|  89.3k|		}
  146|      0|		else {
  147|       |			/* Not seekable. This must be some kind of pipe.
  148|       |			 */
  149|      0|			VIPS_DEBUG_MSG("    not seekable\n");
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  150|      0|			source->is_pipe = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  151|      0|		}
  152|  89.3k|	}
  153|       |
  154|  2.40M|	return 0;
  155|  2.40M|}

sourcecustom.c:vips_source_custom_class_init:
  165|      1|{
  166|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  167|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|      1|	VipsSourceClass *source_class = VIPS_SOURCE_CLASS(class);
  ------------------
  |  |  109|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  110|      1|		VIPS_TYPE_SOURCE, VipsSourceClass))
  ------------------
  169|       |
  170|      1|	gobject_class->dispose = vips_source_custom_dispose;
  171|       |
  172|      1|	object_class->nickname = "source_custom";
  173|      1|	object_class->description = _("Custom source");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  174|       |
  175|      1|	source_class->read = vips_source_custom_read_real;
  176|      1|	source_class->seek = vips_source_custom_seek_real;
  177|       |
  178|      1|	class->read = vips_source_custom_read_signal_real;
  179|      1|	class->seek = vips_source_custom_seek_signal_real;
  180|       |
  181|       |	/**
  182|       |	 * VipsSourceCustom::read:
  183|       |	 * @source_custom: the source being operated on
  184|       |	 * @buffer: %gpointer, buffer to fill
  185|       |	 * @size: %gint64, size of buffer
  186|       |	 *
  187|       |	 * This signal is emitted to read bytes from the source into @buffer.
  188|       |	 *
  189|       |	 * Returns: the number of bytes read. Return 0 for EOF.
  190|       |	 */
  191|      1|	vips_source_custom_signals[SIG_READ] = g_signal_new("read",
  192|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
  193|      1|		G_SIGNAL_ACTION,
  194|      1|		G_STRUCT_OFFSET(VipsSourceCustomClass, read),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
  195|      1|		NULL, NULL,
  196|      1|		vips_INT64__POINTER_INT64,
  197|      1|		G_TYPE_INT64, 2,
  ------------------
  |  |  118|      1|#define G_TYPE_INT64			G_TYPE_MAKE_FUNDAMENTAL (10)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  198|      1|		G_TYPE_POINTER, G_TYPE_INT64);
  ------------------
  |  |  160|      1|#define G_TYPE_POINTER			G_TYPE_MAKE_FUNDAMENTAL (17)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              		G_TYPE_POINTER, G_TYPE_INT64);
  ------------------
  |  |  118|      1|#define G_TYPE_INT64			G_TYPE_MAKE_FUNDAMENTAL (10)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  199|       |
  200|       |	/**
  201|       |	 * VipsSourceCustom::seek:
  202|       |	 * @source_custom: the source being operated on
  203|       |	 * @offset: %gint64, seek offset
  204|       |	 * @whence: %gint, seek origin
  205|       |	 *
  206|       |	 * This signal is emitted to seek the source. The handler should
  207|       |	 * change the source position appropriately.
  208|       |	 *
  209|       |	 * The handler for an unseekable source should always return -1.
  210|       |	 *
  211|       |	 * Returns: the new seek position.
  212|       |	 */
  213|      1|	vips_source_custom_signals[SIG_SEEK] = g_signal_new("seek",
  214|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
  215|      1|		G_SIGNAL_ACTION,
  216|      1|		G_STRUCT_OFFSET(VipsSourceCustomClass, seek),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
  217|      1|		NULL, NULL,
  218|      1|		vips_INT64__INT64_INT,
  219|      1|		G_TYPE_INT64, 2,
  ------------------
  |  |  118|      1|#define G_TYPE_INT64			G_TYPE_MAKE_FUNDAMENTAL (10)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  220|      1|		G_TYPE_INT64, G_TYPE_INT);
  ------------------
  |  |  118|      1|#define G_TYPE_INT64			G_TYPE_MAKE_FUNDAMENTAL (10)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              		G_TYPE_INT64, G_TYPE_INT);
  ------------------
  |  |   94|      1|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  221|      1|}

system.c:vips_system_class_init:
  259|      1|{
  260|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  261|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  262|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  263|       |
  264|      1|	gobject_class->dispose = vips_system_dispose;
  265|      1|	gobject_class->set_property = vips_object_set_property;
  266|      1|	gobject_class->get_property = vips_object_get_property;
  267|       |
  268|      1|	vobject_class->nickname = "system";
  269|      1|	vobject_class->description = _("run an external command");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  270|      1|	vobject_class->build = vips_system_build;
  271|       |
  272|       |	/* Commands can have side-effects, so don't cache them.
  273|       |	 */
  274|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  275|       |
  276|      1|	VIPS_ARG_BOXED(class, "in", 0,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  277|      1|		_("Input"),
  278|      1|		_("Array of input images"),
  279|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  280|      1|		G_STRUCT_OFFSET(VipsSystem, in),
  281|      1|		VIPS_TYPE_ARRAY_IMAGE);
  282|       |
  283|      1|	VIPS_ARG_IMAGE(class, "out", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  284|      1|		_("Output"),
  285|      1|		_("Output image"),
  286|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  287|      1|		G_STRUCT_OFFSET(VipsSystem, out));
  288|       |
  289|      1|	VIPS_ARG_STRING(class, "cmd_format", 2,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  290|      1|		_("Command"),
  291|      1|		_("Command to run"),
  292|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  293|      1|		G_STRUCT_OFFSET(VipsSystem, cmd_format),
  294|      1|		NULL);
  295|       |
  296|      1|	VIPS_ARG_STRING(class, "in_format", 2,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  297|      1|		_("Input format"),
  298|      1|		_("Format for input filename"),
  299|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  300|      1|		G_STRUCT_OFFSET(VipsSystem, in_format),
  301|      1|		NULL);
  302|       |
  303|      1|	VIPS_ARG_STRING(class, "out_format", 2,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  304|      1|		_("Output format"),
  305|      1|		_("Format for output filename"),
  306|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  307|      1|		G_STRUCT_OFFSET(VipsSystem, out_format),
  308|      1|		NULL);
  309|       |
  310|      1|	VIPS_ARG_STRING(class, "log", 2,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
  311|      1|		_("Log"),
  312|      1|		_("Command log"),
  313|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  314|      1|		G_STRUCT_OFFSET(VipsSystem, log),
  315|      1|		NULL);
  316|      1|}

vips_target_new_to_memory:
  389|  10.9k|{
  390|  10.9k|	VipsTarget *target;
  391|       |
  392|  10.9k|	VIPS_DEBUG_MSG("vips_target_new_to_memory:\n");
  ------------------
  |  |   47|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  10.9k|	{ \
  |  |   49|  10.9k|		; \
  |  |   50|  10.9k|	} \
  |  |   51|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  393|       |
  394|  10.9k|	target = VIPS_TARGET(g_object_new(VIPS_TYPE_TARGET,
  ------------------
  |  |  382|  10.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  10.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  383|  10.9k|		VIPS_TYPE_TARGET, VipsTarget))
  ------------------
  395|  10.9k|		"memory", TRUE,
  396|  10.9k|		NULL));
  397|       |
  398|  10.9k|	if (vips_object_build(VIPS_OBJECT(target))) {
  ------------------
  |  |  433|  10.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  10.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (398:6): [True: 0, False: 10.9k]
  ------------------
  399|      0|		VIPS_UNREF(target);
  ------------------
  |  |   57|      0|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  400|      0|		return NULL;
  401|      0|	}
  402|       |
  403|  10.9k|	return target;
  404|  10.9k|}
vips_target_write:
  515|   127k|{
  516|   127k|	VIPS_DEBUG_MSG("vips_target_write: %zd bytes\n", length);
  ------------------
  |  |   47|   127k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   127k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   127k|	{ \
  |  |   49|   127k|		; \
  |  |   50|   127k|	} \
  |  |   51|   127k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   127k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  517|       |
  518|   127k|	if (length > VIPS_TARGET_BUFFER_SIZE - target->write_point &&
  ------------------
  |  |  397|   127k|#define VIPS_TARGET_BUFFER_SIZE (8500)
  ------------------
  |  Branch (518:6): [True: 65, False: 127k]
  ------------------
  519|   127k|		vips_target_flush(target))
  ------------------
  |  Branch (519:3): [True: 0, False: 65]
  ------------------
  520|      0|		return -1;
  521|       |
  522|   127k|	if (length > VIPS_TARGET_BUFFER_SIZE - target->write_point) {
  ------------------
  |  |  397|   127k|#define VIPS_TARGET_BUFFER_SIZE (8500)
  ------------------
  |  Branch (522:6): [True: 42, False: 127k]
  ------------------
  523|       |		/* Still too large? Do an unbuffered write.
  524|       |		 */
  525|     42|		if (vips_target_write_unbuffered(target, buffer, length))
  ------------------
  |  Branch (525:7): [True: 0, False: 42]
  ------------------
  526|      0|			return -1;
  527|     42|	}
  528|   127k|	else {
  529|   127k|		memcpy(target->output_buffer + target->write_point,
  530|   127k|			buffer, length);
  531|   127k|		target->write_point += length;
  532|   127k|	}
  533|       |
  534|   127k|	return 0;
  535|   127k|}
vips_target_end:
  617|  4.03k|{
  618|  4.03k|	VipsTargetClass *class = VIPS_TARGET_GET_CLASS(target);
  ------------------
  |  |  392|  4.03k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  4.03k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  4.03k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  393|  4.03k|		VIPS_TYPE_TARGET, VipsTargetClass))
  ------------------
  619|       |
  620|  4.03k|	VIPS_DEBUG_MSG("vips_target_end:\n");
  ------------------
  |  |   47|  4.03k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.03k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  4.03k|	{ \
  |  |   49|  4.03k|		; \
  |  |   50|  4.03k|	} \
  |  |   51|  4.03k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.03k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  621|       |
  622|  4.03k|	if (target->ended)
  ------------------
  |  Branch (622:6): [True: 0, False: 4.03k]
  ------------------
  623|      0|		return 0;
  624|       |
  625|  4.03k|	if (vips_target_flush(target))
  ------------------
  |  Branch (625:6): [True: 0, False: 4.03k]
  ------------------
  626|      0|		return -1;
  627|       |
  628|       |	/* Move the target buffer into the blob so it can be read out.
  629|       |	 */
  630|  4.03k|	if (target->memory_buffer) {
  ------------------
  |  Branch (630:6): [True: 4.03k, False: 0]
  ------------------
  631|  4.03k|		const char *data;
  632|  4.03k|		size_t length;
  633|       |
  634|  4.03k|		length = target->memory_buffer->len;
  635|  4.03k|		data = g_string_free(target->memory_buffer, FALSE);
  ------------------
  |  |  794|  4.03k|#define	FALSE	(0)
  ------------------
  636|  4.03k|		target->memory_buffer = NULL;
  637|  4.03k|		vips_blob_set(target->blob,
  638|  4.03k|			(VipsCallbackFn) vips_area_free_cb, data, length);
  639|  4.03k|	}
  640|      0|	else {
  641|      0|		if (class->end(target))
  ------------------
  |  Branch (641:7): [True: 0, False: 0]
  ------------------
  642|      0|			return -1;
  643|      0|	}
  644|       |
  645|  4.03k|	target->ended = TRUE;
  ------------------
  |  |  798|  4.03k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  4.03k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  646|       |
  647|  4.03k|	return 0;
  648|  4.03k|}
target.c:vips_target_class_init:
  274|      1|{
  275|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  276|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  277|       |
  278|      1|	gobject_class->finalize = vips_target_finalize;
  279|      1|	gobject_class->set_property = vips_object_set_property;
  280|      1|	gobject_class->get_property = vips_object_get_property;
  281|       |
  282|      1|	object_class->nickname = "target";
  283|      1|	object_class->description = _("Target");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  284|       |
  285|      1|	object_class->build = vips_target_build;
  286|       |
  287|      1|	class->write = vips_target_write_real;
  288|      1|	class->read = vips_target_read_real;
  289|      1|	class->seek = vips_target_seek_real;
  290|      1|	class->end = vips_target_end_real;
  291|      1|	class->finish = vips_target_finish_real;
  292|       |
  293|      1|	VIPS_ARG_BOOL(class, "memory", 3,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  294|      1|		_("Memory"),
  295|      1|		_("File descriptor should output to memory"),
  296|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  297|      1|		G_STRUCT_OFFSET(VipsTarget, memory),
  298|      1|		FALSE);
  299|       |
  300|       |	/* SET_ALWAYS means that blob is set by C and the obj system is not
  301|       |	 * involved in creation or destruction. It can be read at any time.
  302|       |	 */
  303|      1|	VIPS_ARG_BOXED(class, "blob", 4,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  304|      1|		_("Blob"),
  305|      1|		_("Blob to save to"),
  306|      1|		VIPS_ARGUMENT_SET_ALWAYS,
  307|      1|		G_STRUCT_OFFSET(VipsTarget, blob),
  308|      1|		VIPS_TYPE_BLOB);
  309|      1|}
target.c:vips_target_finalize:
   76|  10.9k|{
   77|  10.9k|	VipsTarget *target = VIPS_TARGET(gobject);
  ------------------
  |  |  382|  10.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  10.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  383|  10.9k|		VIPS_TYPE_TARGET, VipsTarget))
  ------------------
   78|       |
   79|  10.9k|	VIPS_DEBUG_MSG("vips_target_finalize:\n");
  ------------------
  |  |   47|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  10.9k|	{ \
  |  |   49|  10.9k|		; \
  |  |   50|  10.9k|	} \
  |  |   51|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   80|       |
   81|  10.9k|	if (target->memory_buffer) {
  ------------------
  |  Branch (81:6): [True: 6.88k, False: 4.03k]
  ------------------
   82|  6.88k|		g_string_free(target->memory_buffer, TRUE);
  ------------------
  |  |  798|  6.88k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  6.88k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
   83|  6.88k|		target->memory_buffer = NULL;
   84|  6.88k|	}
   85|       |
   86|  10.9k|	if (target->blob) {
  ------------------
  |  Branch (86:6): [True: 0, False: 10.9k]
  ------------------
   87|      0|		vips_area_unref(VIPS_AREA(target->blob));
  ------------------
  |  |  137|      0|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
   88|      0|		target->blob = NULL;
   89|      0|	}
   90|       |
   91|  10.9k|	if (target->delete_on_close &&
  ------------------
  |  Branch (91:6): [True: 0, False: 10.9k]
  ------------------
   92|  10.9k|		target->delete_on_close_filename)
  ------------------
  |  Branch (92:3): [True: 0, False: 0]
  ------------------
   93|      0|		g_unlink(target->delete_on_close_filename);
   94|       |
   95|  10.9k|	VIPS_FREE(target->delete_on_close_filename);
  ------------------
  |  |   50|  10.9k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  10.9k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  10.9k|	{ \
  |  |  |  |   43|  10.9k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 10.9k]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|  10.9k|	} \
  |  |  |  |   48|  10.9k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   96|       |
   97|  10.9k|	G_OBJECT_CLASS(vips_target_parent_class)->finalize(gobject);
  ------------------
  |  |   58|  10.9k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  10.9k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  10.9k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|  10.9k|}
target.c:vips_target_build:
  102|  10.9k|{
  103|  10.9k|	VipsConnection *connection = VIPS_CONNECTION(object);
  ------------------
  |  |   48|  10.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  10.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|  10.9k|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  104|  10.9k|	VipsTarget *target = VIPS_TARGET(object);
  ------------------
  |  |  382|  10.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  10.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  383|  10.9k|		VIPS_TYPE_TARGET, VipsTarget))
  ------------------
  105|       |
  106|  10.9k|	VIPS_DEBUG_MSG("vips_target_build: %p\n", connection);
  ------------------
  |  |   47|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  10.9k|	{ \
  |  |   49|  10.9k|		; \
  |  |   50|  10.9k|	} \
  |  |   51|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  107|       |
  108|  10.9k|	if (VIPS_OBJECT_CLASS(vips_target_parent_class)->build(object))
  ------------------
  |  |  435|  10.9k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  10.9k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  10.9k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (108:6): [True: 0, False: 10.9k]
  ------------------
  109|      0|		return -1;
  110|       |
  111|  10.9k|	if (vips_object_argument_isset(object, "filename") &&
  ------------------
  |  Branch (111:6): [True: 0, False: 10.9k]
  ------------------
  112|  10.9k|		vips_object_argument_isset(object, "descriptor")) {
  ------------------
  |  Branch (112:3): [True: 0, False: 0]
  ------------------
  113|      0|		vips_error(vips_connection_nick(connection),
  114|      0|			"%s", _("don't set 'filename' and 'descriptor'"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  115|      0|		return -1;
  116|      0|	}
  117|       |
  118|  10.9k|	if (connection->filename) {
  ------------------
  |  Branch (118:6): [True: 0, False: 10.9k]
  ------------------
  119|      0|		const char *filename = connection->filename;
  120|       |
  121|      0|		int fd;
  122|       |
  123|       |		/* 0644 is rw user, r group and other.
  124|       |		 */
  125|      0|		if ((fd = vips_tracked_open(filename,
  ------------------
  |  Branch (125:7): [True: 0, False: 0]
  ------------------
  126|      0|				 MODE_READWRITE, 0644)) == -1) {
  ------------------
  |  |   70|      0|#define MODE_READWRITE CLOEXEC(BINARYIZE(O_RDWR | O_CREAT | O_TRUNC))
  |  |  ------------------
  |  |  |  |   68|      0|#define CLOEXEC(M) ((M) | O_CLOEXEC)
  |  |  ------------------
  ------------------
  127|      0|			vips_error_system(errno,
  128|      0|				vips_connection_nick(connection),
  129|      0|				"%s", _("unable to open for write"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  130|      0|			return -1;
  131|      0|		}
  132|       |
  133|      0|		connection->tracked_descriptor = fd;
  134|      0|		connection->descriptor = fd;
  135|      0|	}
  136|  10.9k|	else if (vips_object_argument_isset(object, "descriptor")) {
  ------------------
  |  Branch (136:11): [True: 0, False: 10.9k]
  ------------------
  137|      0|		connection->descriptor = dup(connection->descriptor);
  138|      0|		connection->close_descriptor = connection->descriptor;
  139|       |
  140|       |#ifdef G_OS_WIN32
  141|       |		/* Windows will create eg. stdin and stdout in text mode.
  142|       |		 * We always write in binary mode.
  143|       |		 */
  144|       |		_setmode(connection->descriptor, _O_BINARY);
  145|       |#endif /*G_OS_WIN32*/
  146|      0|	}
  147|  10.9k|	else if (target->memory)
  ------------------
  |  Branch (147:11): [True: 10.9k, False: 0]
  ------------------
  148|  10.9k|		target->memory_buffer =
  149|  10.9k|			g_string_sized_new(VIPS_TARGET_BUFFER_SIZE);
  ------------------
  |  |  397|  10.9k|#define VIPS_TARGET_BUFFER_SIZE (8500)
  ------------------
  150|       |
  151|  10.9k|	return 0;
  152|  10.9k|}
target.c:vips_target_write_real:
  156|  4.14k|{
  157|  4.14k|	VipsConnection *connection = VIPS_CONNECTION(target);
  ------------------
  |  |   48|  4.14k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  4.14k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  4.14k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|  4.14k|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  158|       |
  159|  4.14k|	gint64 result;
  160|       |
  161|  4.14k|	VIPS_DEBUG_MSG("vips_target_write_real: %zd bytes\n", length);
  ------------------
  |  |   47|  4.14k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.14k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  4.14k|	{ \
  |  |   49|  4.14k|		; \
  |  |   50|  4.14k|	} \
  |  |   51|  4.14k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.14k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  162|       |
  163|  4.14k|	if (target->memory_buffer) {
  ------------------
  |  Branch (163:6): [True: 4.14k, False: 0]
  ------------------
  164|  4.14k|		VIPS_DEBUG_MSG("vips_target_write_real: to position %zd\n",
  ------------------
  |  |   47|  4.14k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.14k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  4.14k|	{ \
  |  |   49|  4.14k|		; \
  |  |   50|  4.14k|	} \
  |  |   51|  4.14k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.14k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  165|  4.14k|			target->position);
  166|       |
  167|  4.14k|		g_string_overwrite_len(target->memory_buffer, target->position,
  168|  4.14k|			data, length);
  169|  4.14k|		target->position += length;
  170|  4.14k|		result = length;
  171|  4.14k|	}
  172|      0|	else
  173|      0|		result = write(connection->descriptor, data, length);
  174|       |
  175|  4.14k|	return result;
  176|  4.14k|}
target.c:vips_target_init:
  313|  10.9k|{
  314|  10.9k|	target->blob = vips_blob_new(NULL, NULL, 0);
  315|  10.9k|	target->write_point = 0;
  316|  10.9k|}
target.c:vips_target_flush:
  487|  4.09k|{
  488|  4.09k|	g_assert(target->write_point >= 0);
  ------------------
  |  |  166|  4.09k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  4.09k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.09k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  489|  4.09k|	g_assert(target->write_point <= VIPS_TARGET_BUFFER_SIZE);
  ------------------
  |  |  166|  4.09k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  4.09k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.09k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  490|       |
  491|  4.09k|	VIPS_DEBUG_MSG("vips_target_flush:\n");
  ------------------
  |  |   47|  4.09k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.09k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  4.09k|	{ \
  |  |   49|  4.09k|		; \
  |  |   50|  4.09k|	} \
  |  |   51|  4.09k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.09k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  492|       |
  493|  4.09k|	if (target->write_point > 0) {
  ------------------
  |  Branch (493:6): [True: 4.09k, False: 0]
  ------------------
  494|  4.09k|		if (vips_target_write_unbuffered(target,
  ------------------
  |  Branch (494:7): [True: 0, False: 4.09k]
  ------------------
  495|  4.09k|				target->output_buffer, target->write_point))
  496|      0|			return -1;
  497|  4.09k|		target->write_point = 0;
  498|  4.09k|	}
  499|       |
  500|  4.09k|	return 0;
  501|  4.09k|}
target.c:vips_target_write_unbuffered:
  453|  4.14k|{
  454|  4.14k|	VipsTargetClass *class = VIPS_TARGET_GET_CLASS(target);
  ------------------
  |  |  392|  4.14k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  4.14k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  4.14k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  393|  4.14k|		VIPS_TYPE_TARGET, VipsTargetClass))
  ------------------
  455|       |
  456|  4.14k|	VIPS_DEBUG_MSG("vips_target_write_unbuffered:\n");
  ------------------
  |  |   47|  4.14k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.14k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  4.14k|	{ \
  |  |   49|  4.14k|		; \
  |  |   50|  4.14k|	} \
  |  |   51|  4.14k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.14k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  457|       |
  458|  4.14k|	if (target->ended)
  ------------------
  |  Branch (458:6): [True: 0, False: 4.14k]
  ------------------
  459|      0|		return 0;
  460|       |
  461|  8.28k|	while (length > 0) {
  ------------------
  |  Branch (461:9): [True: 4.14k, False: 4.14k]
  ------------------
  462|       |		// write() uses int not size_t on windows, so we need to chunk
  463|       |		// ... max 1gb, why not
  464|  4.14k|		int chunk_size = VIPS_MIN(1024 * 1024 * 1024, length);
  ------------------
  |  |   55|  4.14k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 4.14k]
  |  |  ------------------
  ------------------
  465|  4.14k|		gint64 bytes_written = class->write(target, data, chunk_size);
  466|       |
  467|       |		/* n == 0 isn't strictly an error, but we treat it as
  468|       |		 * one to make sure we don't get stuck in this loop.
  469|       |		 */
  470|  4.14k|		if (bytes_written <= 0) {
  ------------------
  |  Branch (470:7): [True: 0, False: 4.14k]
  ------------------
  471|      0|			vips_error_system(errno,
  472|      0|				vips_connection_nick(
  473|      0|					VIPS_CONNECTION(target)),
  ------------------
  |  |   48|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|      0|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  474|      0|				"%s", _("write error"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  475|      0|			return -1;
  476|      0|		}
  477|       |
  478|  4.14k|		length -= bytes_written;
  479|  4.14k|		data = (char *) data + bytes_written;
  480|  4.14k|	}
  481|       |
  482|  4.14k|	return 0;
  483|  4.14k|}

targetcustom.c:vips_target_custom_class_init:
  230|      1|{
  231|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  232|      1|	VipsTargetClass *target_class = VIPS_TARGET_CLASS(class);
  ------------------
  |  |  385|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  386|      1|		VIPS_TYPE_TARGET, VipsTargetClass))
  ------------------
  233|       |
  234|      1|	object_class->nickname = "target_custom";
  235|      1|	object_class->description = _("Custom target");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  236|       |
  237|      1|	target_class->write = vips_target_custom_write_real;
  238|      1|	target_class->read = vips_target_custom_read_real;
  239|      1|	target_class->seek = vips_target_custom_seek_real;
  240|      1|	target_class->end = vips_target_custom_end_real;
  241|      1|	target_class->finish = vips_target_custom_finish_real;
  242|       |
  243|      1|	class->write = vips_target_custom_write_signal_real;
  244|      1|	class->read = vips_target_custom_read_signal_real;
  245|      1|	class->seek = vips_target_custom_seek_signal_real;
  246|      1|	class->end = vips_target_custom_end_signal_real;
  247|      1|	class->finish = vips_target_custom_finish_signal_real;
  248|       |
  249|       |	/**
  250|       |	 * VipsTargetCustom::write:
  251|       |	 * @target_custom: the target being operated on
  252|       |	 * @data: %pointer, bytes to write
  253|       |	 * @length: %gint64, number of bytes
  254|       |	 *
  255|       |	 * This signal is emitted to write bytes to the target.
  256|       |	 *
  257|       |	 * Returns: the number of bytes written.
  258|       |	 */
  259|      1|	vips_target_custom_signals[SIG_WRITE] = g_signal_new("write",
  260|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
  261|      1|		G_SIGNAL_ACTION,
  262|      1|		G_STRUCT_OFFSET(VipsTargetCustomClass, write),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
  263|      1|		NULL, NULL,
  264|      1|		vips_INT64__POINTER_INT64,
  265|      1|		G_TYPE_INT64, 2,
  ------------------
  |  |  118|      1|#define G_TYPE_INT64			G_TYPE_MAKE_FUNDAMENTAL (10)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  266|      1|		G_TYPE_POINTER, G_TYPE_INT64);
  ------------------
  |  |  160|      1|#define G_TYPE_POINTER			G_TYPE_MAKE_FUNDAMENTAL (17)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              		G_TYPE_POINTER, G_TYPE_INT64);
  ------------------
  |  |  118|      1|#define G_TYPE_INT64			G_TYPE_MAKE_FUNDAMENTAL (10)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|       |
  268|       |	/**
  269|       |	 * VipsTargetCustom::read:
  270|       |	 * @target_custom: the target being operated on
  271|       |	 * @buffer: %gpointer, buffer to fill
  272|       |	 * @size: %gint64, size of buffer
  273|       |	 *
  274|       |	 * This signal is emitted to read bytes from the target into @buffer.
  275|       |	 *
  276|       |	 * The handler for an unreadable target should always return -1.
  277|       |	 *
  278|       |	 * Returns: the number of bytes read. Return 0 for EOF.
  279|       |	 */
  280|      1|	vips_target_custom_signals[SIG_READ] = g_signal_new("read",
  281|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
  282|      1|		G_SIGNAL_ACTION,
  283|      1|		G_STRUCT_OFFSET(VipsTargetCustomClass, read),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
  284|      1|		NULL, NULL,
  285|      1|		vips_INT64__POINTER_INT64,
  286|      1|		G_TYPE_INT64, 2,
  ------------------
  |  |  118|      1|#define G_TYPE_INT64			G_TYPE_MAKE_FUNDAMENTAL (10)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  287|      1|		G_TYPE_POINTER, G_TYPE_INT64);
  ------------------
  |  |  160|      1|#define G_TYPE_POINTER			G_TYPE_MAKE_FUNDAMENTAL (17)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              		G_TYPE_POINTER, G_TYPE_INT64);
  ------------------
  |  |  118|      1|#define G_TYPE_INT64			G_TYPE_MAKE_FUNDAMENTAL (10)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  288|       |
  289|       |	/**
  290|       |	 * VipsTargetCustom::seek:
  291|       |	 * @target_custom: the target being operated on
  292|       |	 * @offset: %gint64, seek offset
  293|       |	 * @whence: %gint, seek origin
  294|       |	 *
  295|       |	 * This signal is emitted to seek the target. The handler should
  296|       |	 * change the target position appropriately.
  297|       |	 *
  298|       |	 * The handler for an unseekable target should always return -1.
  299|       |	 *
  300|       |	 * Returns: the new seek position.
  301|       |	 */
  302|      1|	vips_target_custom_signals[SIG_SEEK] = g_signal_new("seek",
  303|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
  304|      1|		G_SIGNAL_ACTION,
  305|      1|		G_STRUCT_OFFSET(VipsTargetCustomClass, seek),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
  306|      1|		NULL, NULL,
  307|      1|		vips_INT64__INT64_INT,
  308|      1|		G_TYPE_INT64, 2,
  ------------------
  |  |  118|      1|#define G_TYPE_INT64			G_TYPE_MAKE_FUNDAMENTAL (10)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  309|      1|		G_TYPE_INT64, G_TYPE_INT);
  ------------------
  |  |  118|      1|#define G_TYPE_INT64			G_TYPE_MAKE_FUNDAMENTAL (10)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              		G_TYPE_INT64, G_TYPE_INT);
  ------------------
  |  |   94|      1|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  310|       |
  311|       |	/**
  312|       |	 * VipsTargetCustom::end:
  313|       |	 * @target_custom: the target being operated on
  314|       |	 *
  315|       |	 * This signal is emitted at the end of write. The target should do
  316|       |	 * any finishing necessary.
  317|       |	 *
  318|       |	 * Returns: 0 on success, -1 on error.
  319|       |	 */
  320|      1|	vips_target_custom_signals[SIG_END] = g_signal_new("end",
  321|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
  322|      1|		G_SIGNAL_ACTION,
  323|      1|		G_STRUCT_OFFSET(VipsTargetCustomClass, end),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
  324|      1|		NULL, NULL,
  325|      1|		vips_INT__VOID,
  326|      1|		G_TYPE_INT, 0);
  ------------------
  |  |   94|      1|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  327|       |
  328|       |	/**
  329|       |	 * VipsTargetCustom::finish:
  330|       |	 * @target_custom: the target being operated on
  331|       |	 *
  332|       |	 * Deprecated for VipsTargetCustom::end.
  333|       |	 */
  334|      1|	vips_target_custom_signals[SIG_FINISH] = g_signal_new("finish",
  335|      1|		G_TYPE_FROM_CLASS(class),
  ------------------
  |  |  613|      1|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  ------------------
  336|      1|		G_SIGNAL_ACTION,
  337|      1|		G_STRUCT_OFFSET(VipsTargetCustomClass, finish),
  ------------------
  |  |  833|      1|      ((glong) offsetof (struct_type, member))
  ------------------
  338|      1|		NULL, NULL,
  339|      1|		g_cclosure_marshal_VOID__VOID,
  340|      1|		G_TYPE_NONE, 0);
  ------------------
  |  |   62|      1|#define G_TYPE_NONE			G_TYPE_MAKE_FUNDAMENTAL (1)
  |  |  ------------------
  |  |  |  |  221|      1|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|      1|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  341|      1|}

vips_thread_isvips:
   86|  1.16M|{
   87|  1.16M|	return g_private_get(&is_vips_thread_key) != NULL;
   88|  1.16M|}
vips_g_mutex_new:
   95|   771k|{
   96|   771k|	GMutex *mutex;
   97|       |
   98|   771k|	mutex = g_new(GMutex, 1);
  ------------------
  |  |  282|   771k|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|   771k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   771k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   771k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   771k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   771k|	  gpointer __p;						\
  |  |  |  |  231|   771k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 771k]
  |  |  |  |  ------------------
  |  |  |  |  232|   771k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   771k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 771k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|   771k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 771k]
  |  |  |  |  |  Branch (234:26): [True: 771k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   771k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   771k|	  else							\
  |  |  |  |  237|   771k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   771k|	  __p;							\
  |  |  |  |  239|   771k|	}))
  |  |  ------------------
  ------------------
   99|   771k|	g_mutex_init(mutex);
  100|       |
  101|   771k|	return mutex;
  102|   771k|}
vips_g_mutex_free:
  106|   771k|{
  107|   771k|	g_mutex_clear(mutex);
  108|   771k|	g_free(mutex);
  109|   771k|}
vips_g_cond_new:
  113|   188k|{
  114|   188k|	GCond *cond;
  115|       |
  116|   188k|	cond = g_new(GCond, 1);
  ------------------
  |  |  282|   188k|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|   188k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   188k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   188k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   188k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   188k|	  gpointer __p;						\
  |  |  |  |  231|   188k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 188k]
  |  |  |  |  ------------------
  |  |  |  |  232|   188k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   188k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 188k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|   188k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 188k]
  |  |  |  |  |  Branch (234:26): [True: 188k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   188k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   188k|	  else							\
  |  |  |  |  237|   188k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   188k|	  __p;							\
  |  |  |  |  239|   188k|	}))
  |  |  ------------------
  ------------------
  117|   188k|	g_cond_init(cond);
  118|       |
  119|   188k|	return cond;
  120|   188k|}
vips_g_cond_free:
  124|   188k|{
  125|   188k|	g_cond_clear(cond);
  126|   188k|	g_free(cond);
  127|   188k|}
vips_g_thread_new:
  159|     10|{
  160|     10|	GThread *thread;
  161|     10|	VipsThreadInfo *info;
  162|     10|	GError *error = NULL;
  163|       |
  164|     10|	info = g_new(VipsThreadInfo, 1);
  ------------------
  |  |  282|     10|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|     10|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|     10|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|     10|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|     10|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|     10|	  gpointer __p;						\
  |  |  |  |  231|     10|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 10]
  |  |  |  |  ------------------
  |  |  |  |  232|     10|	    __p = g_##func (__n);				\
  |  |  |  |  233|     10|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 10, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|     10|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 10]
  |  |  |  |  |  Branch (234:26): [True: 10, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|     10|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|     10|	  else							\
  |  |  |  |  237|     10|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|     10|	  __p;							\
  |  |  |  |  239|     10|	}))
  |  |  ------------------
  ------------------
  165|     10|	info->domain = domain;
  166|     10|	info->func = func;
  167|     10|	info->data = data;
  168|       |
  169|     10|	thread = g_thread_try_new(domain, vips_thread_run, info, &error);
  170|       |
  171|     10|	VIPS_DEBUG_MSG_RED("vips_g_thread_new: g_thread_create(%s) = %p\n",
  ------------------
  |  |   63|     10|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     10|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|     10|	{ \
  |  |   65|     10|		; \
  |  |   66|     10|	} \
  |  |   67|     10|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     10|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  172|     10|		domain, thread);
  173|       |
  174|     10|	if (!thread) {
  ------------------
  |  Branch (174:6): [True: 0, False: 10]
  ------------------
  175|      0|		if (error)
  ------------------
  |  Branch (175:7): [True: 0, False: 0]
  ------------------
  176|      0|			vips_g_error(&error);
  177|      0|		else
  178|      0|			vips_error(domain,
  179|      0|				"%s", _("unable to create thread"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  180|      0|	}
  181|       |
  182|     10|	return thread;
  183|     10|}
vips_concurrency_set:
  235|      2|{
  236|       |	/* Tell the threads system how much concurrency we expect.
  237|       |	 */
  238|      2|	if (concurrency < 1)
  ------------------
  |  Branch (238:6): [True: 0, False: 2]
  ------------------
  239|      0|		concurrency = vips__concurrency_get_default();
  240|      2|	else if (concurrency > MAX_THREADS) {
  ------------------
  |  |   63|      2|#define MAX_THREADS (1024)
  ------------------
  |  Branch (240:11): [True: 0, False: 2]
  ------------------
  241|      0|		concurrency = MAX_THREADS;
  ------------------
  |  |   63|      0|#define MAX_THREADS (1024)
  ------------------
  242|       |
  243|      0|		g_warning(_("threads clipped to %d"), MAX_THREADS);
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  244|      0|	}
  245|       |
  246|      2|	vips__concurrency = concurrency;
  247|      2|}
vips_concurrency_get:
  275|  94.0k|{
  276|  94.0k|	return vips__concurrency;
  277|  94.0k|}
vips_get_tile_size:
  297|  65.6k|{
  298|  65.6k|	const int nthr = vips_concurrency_get();
  299|  65.6k|	const int typical_image_width = 1000;
  300|       |
  301|       |	/* Compiler warnings.
  302|       |	 */
  303|  65.6k|	*tile_width = 1;
  304|  65.6k|	*tile_height = 1;
  305|       |
  306|       |	/* Pick a render geometry.
  307|       |	 */
  308|  65.6k|	switch (im->dhint) {
  309|  1.64k|	case VIPS_DEMAND_STYLE_SMALLTILE:
  ------------------
  |  Branch (309:2): [True: 1.64k, False: 63.9k]
  ------------------
  310|  1.64k|		*tile_width = vips__tile_width;
  311|  1.64k|		*tile_height = vips__tile_height;
  312|  1.64k|		break;
  313|       |
  314|      0|	case VIPS_DEMAND_STYLE_ANY:
  ------------------
  |  Branch (314:2): [True: 0, False: 65.6k]
  ------------------
  315|  8.88k|	case VIPS_DEMAND_STYLE_FATSTRIP:
  ------------------
  |  Branch (315:2): [True: 8.88k, False: 56.7k]
  ------------------
  316|  8.88k|		*tile_width = im->Xsize;
  317|  8.88k|		*tile_height = vips__fatstrip_height;
  318|  8.88k|		break;
  319|       |
  320|  55.1k|	case VIPS_DEMAND_STYLE_THINSTRIP:
  ------------------
  |  Branch (320:2): [True: 55.1k, False: 10.5k]
  ------------------
  321|  55.1k|		*tile_width = im->Xsize;
  322|       |		/* Only enable thinstrip height for very wide images -- the
  323|       |		 * overheads are too high to be worthwhile otherwise.
  324|       |		 */
  325|  55.1k|		*tile_height = im->Xsize > 10000
  ------------------
  |  Branch (325:18): [True: 0, False: 55.1k]
  ------------------
  326|  55.1k|			? vips__thinstrip_height
  327|  55.1k|			: vips__fatstrip_height;
  328|  55.1k|		break;
  329|       |
  330|      0|	default:
  ------------------
  |  Branch (330:2): [True: 0, False: 65.6k]
  ------------------
  331|      0|		g_assert_not_reached();
  ------------------
  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|  65.6k|	}
  333|       |
  334|       |	/* We can't set n_lines for the current demand style: a later bit of
  335|       |	 * the pipeline might see a different hint and we need to synchronise
  336|       |	 * buffer sizes everywhere.
  337|       |	 *
  338|       |	 * We also can't depend on the current image size, since that might
  339|       |	 * change down the pipeline too. Pick a typical image width.
  340|       |	 *
  341|       |	 * Pick the maximum buffer size we might possibly need, then round up
  342|       |	 * to a multiple of tileheight.
  343|       |	 */
  344|  65.6k|	*n_lines = vips__tile_height *
  345|  65.6k|		VIPS_ROUND_UP(vips__tile_width * nthr,
  ------------------
  |  |  111|  65.6k|#define VIPS_ROUND_UP(N, P) (VIPS_ROUND_DOWN((N) + (P) -1, (P)))
  |  |  ------------------
  |  |  |  |  110|  65.6k|#define VIPS_ROUND_DOWN(N, P) ((N) - ((N) % (P)))
  |  |  ------------------
  ------------------
  346|  65.6k|			typical_image_width) /
  347|  65.6k|		typical_image_width;
  348|  65.6k|	*n_lines = VIPS_MAX(*n_lines, vips__fatstrip_height * nthr);
  ------------------
  |  |   54|  65.6k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 65.6k, False: 0]
  |  |  ------------------
  ------------------
  349|  65.6k|	*n_lines = VIPS_MAX(*n_lines, vips__thinstrip_height * nthr);
  ------------------
  |  |   54|  65.6k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 65.6k, False: 0]
  |  |  ------------------
  ------------------
  350|  65.6k|	*n_lines = VIPS_ROUND_UP(*n_lines, *tile_height);
  ------------------
  |  |  111|  65.6k|#define VIPS_ROUND_UP(N, P) (VIPS_ROUND_DOWN((N) + (P) -1, (P)))
  |  |  ------------------
  |  |  |  |  110|  65.6k|#define VIPS_ROUND_DOWN(N, P) ((N) - ((N) % (P)))
  |  |  ------------------
  ------------------
  351|       |
  352|       |	/* We make this assumption in several places.
  353|       |	 */
  354|  65.6k|	g_assert(*n_lines % *tile_height == 0);
  ------------------
  |  |  166|  65.6k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  65.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  65.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  355|       |
  356|  65.6k|	VIPS_DEBUG_MSG("vips_get_tile_size: %d by %d patches, "
  ------------------
  |  |   47|  65.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  65.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  65.6k|	{ \
  |  |   49|  65.6k|		; \
  |  |   50|  65.6k|	} \
  |  |   51|  65.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  65.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  357|  65.6k|				   "groups of %d scanlines\n",
  358|  65.6k|		*tile_width, *tile_height, *n_lines);
  359|  65.6k|}
vips__thread_init:
  363|      2|{
  364|      2|	if (vips__concurrency == 0)
  ------------------
  |  Branch (364:6): [True: 2, False: 0]
  ------------------
  365|      2|		vips__concurrency = vips__concurrency_get_default();
  366|      2|}
thread.c:vips_thread_run:
  137|     10|{
  138|     10|	VipsThreadInfo *info = (VipsThreadInfo *) data;
  139|       |
  140|     10|	void *result;
  141|       |
  142|       |	/* Set this to something (anything) to tag this thread as a vips
  143|       |	 * worker. No need to call g_private_replace as there is no
  144|       |	 * GDestroyNotify handler associated with a worker.
  145|       |	 */
  146|     10|	g_private_set(&is_vips_thread_key, info);
  147|       |
  148|     10|	result = info->func(info->data);
  149|       |
  150|     10|	g_free(info);
  151|       |
  152|     10|	vips_thread_shutdown();
  153|       |
  154|     10|	return result;
  155|     10|}
thread.c:vips__concurrency_get_default:
  190|      2|{
  191|      2|	const char *str;
  192|      2|	int nthr;
  193|      2|	int x;
  194|       |
  195|       |	/* Tell the threads system how much concurrency we expect.
  196|       |	 */
  197|      2|	if (vips__concurrency > 0)
  ------------------
  |  Branch (197:6): [True: 0, False: 2]
  ------------------
  198|      0|		nthr = vips__concurrency;
  199|      2|	else if (
  200|      2|		((str = g_getenv("VIPS_CONCURRENCY"))
  ------------------
  |  Branch (200:3): [True: 0, False: 2]
  ------------------
  201|       |#if ENABLE_DEPRECATED
  202|       |			|| (str = g_getenv("IM_CONCURRENCY"))
  203|       |#endif
  204|      2|				) &&
  205|      2|		(x = atoi(str)) > 0)
  ------------------
  |  Branch (205:3): [True: 0, False: 0]
  ------------------
  206|      0|		nthr = x;
  207|      2|	else
  208|      2|		nthr = g_get_num_processors();
  209|       |
  210|      2|	if (nthr < 1 ||
  ------------------
  |  Branch (210:6): [True: 0, False: 2]
  ------------------
  211|      2|		nthr > MAX_THREADS) {
  ------------------
  |  |   63|      2|#define MAX_THREADS (1024)
  ------------------
  |  Branch (211:3): [True: 0, False: 2]
  ------------------
  212|      0|		nthr = VIPS_CLIP(1, nthr, MAX_THREADS);
  ------------------
  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  213|       |
  214|      0|		g_warning(_("threads clipped to %d"), nthr);
  ------------------
  |  |  338|      0|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      0|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      0|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      0|                               __VA_ARGS__)
  ------------------
  215|      0|	}
  216|       |
  217|      2|	return nthr;
  218|      2|}

vips__threadpool_init:
  116|      2|{
  117|       |	/* 3 is the useful minimum, and huge values can crash the machine.
  118|       |	 */
  119|      2|	const char *max_threads_env = g_getenv("VIPS_MAX_THREADS");
  120|      2|	int max_threads = max_threads_env
  ------------------
  |  Branch (120:20): [True: 0, False: 2]
  ------------------
  121|      2|		? VIPS_CLIP(3, atoi(max_threads_env), MAX_THREADS)
  ------------------
  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  122|      2|		: 0;
  123|       |
  124|      2|	if (g_getenv("VIPS_STALL"))
  ------------------
  |  Branch (124:6): [True: 0, False: 2]
  ------------------
  125|      0|		vips__stall = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  126|       |
  127|       |	/* max_threads > 0 will create a set of threads on startup. This is
  128|       |	 * necessary for wasm, but may break on systems that try to fork()
  129|       |	 * after init.
  130|       |	 */
  131|      2|	vips__threadset = vips_threadset_new(max_threads);
  132|      2|}
vips_thread_execute:
  153|  50.2k|{
  154|  50.2k|	return vips_threadset_run(vips__threadset, domain, func, data);
  155|  50.2k|}
vips_thread_state_set:
  208|  28.4k|{
  209|  28.4k|	VipsThreadState *state = (VipsThreadState *) object;
  210|  28.4k|	VipsImage *im = (VipsImage *) a;
  211|       |
  212|  28.4k|	VIPS_DEBUG_MSG("vips_thread_state_set: image %p\n", im);
  ------------------
  |  |   47|  28.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  28.4k|	{ \
  |  |   49|  28.4k|		; \
  |  |   50|  28.4k|	} \
  |  |   51|  28.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  213|       |
  214|  28.4k|	state->im = im;
  215|  28.4k|	state->a = b;
  216|       |
  217|  28.4k|	return NULL;
  218|  28.4k|}
vips__worker_lock:
  455|   122k|{
  456|   122k|	VipsWorker *worker = (VipsWorker *) g_private_get(&worker_key);
  457|       |
  458|   122k|	if (worker)
  ------------------
  |  Branch (458:6): [True: 122k, False: 0]
  ------------------
  459|   122k|		g_atomic_int_inc(&worker->pool->n_waiting);
  ------------------
  |  |  143|   122k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|   122k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  144|   122k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|   122k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  145|   122k|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (145:13): [Folded - Ignored]
  |  |  ------------------
  |  |  146|   122k|    (void) __atomic_fetch_add ((atomic), 1, __ATOMIC_SEQ_CST);               \
  |  |  147|   122k|  }))
  ------------------
  460|   122k|	g_mutex_lock(mutex);
  461|   122k|	if (worker)
  ------------------
  |  Branch (461:6): [True: 122k, False: 0]
  ------------------
  462|   122k|		g_atomic_int_dec_and_test(&worker->pool->n_waiting);
  ------------------
  |  |  149|   122k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|   122k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  150|   122k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|   122k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  151|   122k|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (151:13): [Folded - Ignored]
  |  |  ------------------
  |  |  152|   122k|    __atomic_fetch_sub ((atomic), 1, __ATOMIC_SEQ_CST) == 1;                 \
  |  |  153|   122k|  }))
  ------------------
  463|   122k|}
vips__worker_cond_wait:
  467|   105k|{
  468|   105k|	VipsWorker *worker = (VipsWorker *) g_private_get(&worker_key);
  469|       |
  470|   105k|	if (worker)
  ------------------
  |  Branch (470:6): [True: 18.0k, False: 87.1k]
  ------------------
  471|  18.0k|		g_atomic_int_inc(&worker->pool->n_waiting);
  ------------------
  |  |  143|  18.0k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|  18.0k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  144|  18.0k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|  18.0k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  145|  18.0k|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (145:13): [Folded - Ignored]
  |  |  ------------------
  |  |  146|  18.0k|    (void) __atomic_fetch_add ((atomic), 1, __ATOMIC_SEQ_CST);               \
  |  |  147|  18.0k|  }))
  ------------------
  472|   105k|	g_cond_wait(cond, mutex);
  473|   105k|	if (worker)
  ------------------
  |  Branch (473:6): [True: 18.0k, False: 87.1k]
  ------------------
  474|  18.0k|		g_atomic_int_dec_and_test(&worker->pool->n_waiting);
  ------------------
  |  |  149|  18.0k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|  18.0k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  150|  18.0k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|  18.0k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  151|  18.0k|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (151:13): [Folded - Ignored]
  |  |  ------------------
  |  |  152|  18.0k|    __atomic_fetch_sub ((atomic), 1, __ATOMIC_SEQ_CST) == 1;                 \
  |  |  153|  18.0k|  }))
  ------------------
  475|   105k|}
vips_threadpool_run:
  655|  28.4k|{
  656|  28.4k|	VipsThreadpool *pool;
  657|  28.4k|	int result;
  658|  28.4k|	int n_waiting;
  659|  28.4k|	int n_working;
  660|       |
  661|  28.4k|	if (!(pool = vips_threadpool_new(im)))
  ------------------
  |  Branch (661:6): [True: 0, False: 28.4k]
  ------------------
  662|      0|		return -1;
  663|       |
  664|  28.4k|	pool->start = start;
  665|  28.4k|	pool->allocate = allocate;
  666|  28.4k|	pool->work = work;
  667|  28.4k|	pool->a = a;
  668|       |
  669|       |	/* Start with half of the max number of threads, then let it drift up
  670|       |	 * and down with load.
  671|       |	 */
  672|  56.8k|	for (n_working = 0; n_working < 1 + pool->max_workers / 2; n_working++)
  ------------------
  |  Branch (672:22): [True: 28.4k, False: 28.4k]
  ------------------
  673|  28.4k|		if (vips_worker_new(pool)) {
  ------------------
  |  Branch (673:7): [True: 0, False: 28.4k]
  ------------------
  674|      0|			vips_threadpool_free(pool);
  675|      0|			return -1;
  676|      0|		}
  677|       |
  678|  44.1k|	for (;;) {
  679|       |		/* Wait for a tick from a worker.
  680|       |		 */
  681|  44.1k|		vips_semaphore_down(&pool->tick);
  682|       |
  683|  44.1k|		VIPS_DEBUG_MSG("vips_threadpool_run: tick\n");
  ------------------
  |  |   47|  44.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  44.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  44.1k|	{ \
  |  |   49|  44.1k|		; \
  |  |   50|  44.1k|	} \
  |  |   51|  44.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  44.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  684|       |
  685|  44.1k|		if (pool->stop ||
  ------------------
  |  Branch (685:7): [True: 15.8k, False: 28.3k]
  ------------------
  686|  44.1k|			pool->error)
  ------------------
  |  Branch (686:4): [True: 12.4k, False: 15.9k]
  ------------------
  687|  28.2k|			break;
  688|       |
  689|  15.9k|		if (progress &&
  ------------------
  |  Branch (689:7): [True: 15.9k, False: 0]
  ------------------
  690|  15.9k|			progress(pool->a))
  ------------------
  |  Branch (690:4): [True: 0, False: 15.9k]
  ------------------
  691|      0|			pool->error = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  692|       |
  693|  15.9k|		if (pool->stop ||
  ------------------
  |  Branch (693:7): [True: 187, False: 15.7k]
  ------------------
  694|  15.9k|			pool->error)
  ------------------
  |  Branch (694:4): [True: 5, False: 15.7k]
  ------------------
  695|    192|			break;
  696|       |
  697|  15.7k|		n_waiting = g_atomic_int_get(&pool->n_waiting);
  ------------------
  |  |   91|  15.7k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|  15.7k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |   92|  15.7k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|  15.7k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |   93|  15.7k|    gint gaig_temp;                                                          \
  |  |   94|  15.7k|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (94:13): [Folded - Ignored]
  |  |  ------------------
  |  |   95|  15.7k|    __atomic_load ((gint *)(atomic), &gaig_temp, __ATOMIC_SEQ_CST);          \
  |  |   96|  15.7k|    (gint) gaig_temp;                                                        \
  |  |   97|  15.7k|  }))
  ------------------
  698|  15.7k|		VIPS_DEBUG_MSG("n_waiting = %d\n", n_waiting);
  ------------------
  |  |   47|  15.7k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.7k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  15.7k|	{ \
  |  |   49|  15.7k|		; \
  |  |   50|  15.7k|	} \
  |  |   51|  15.7k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.7k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  699|  15.7k|		VIPS_DEBUG_MSG("n_working = %d\n", n_working);
  ------------------
  |  |   47|  15.7k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.7k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  15.7k|	{ \
  |  |   49|  15.7k|		; \
  |  |   50|  15.7k|	} \
  |  |   51|  15.7k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.7k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  700|  15.7k|		VIPS_DEBUG_MSG("exit = %d\n", pool->exit);
  ------------------
  |  |   47|  15.7k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.7k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  15.7k|	{ \
  |  |   49|  15.7k|		; \
  |  |   50|  15.7k|	} \
  |  |   51|  15.7k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.7k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  701|       |
  702|  15.7k|		if (n_waiting > 3 &&
  ------------------
  |  Branch (702:7): [True: 0, False: 15.7k]
  ------------------
  703|  15.7k|			n_working > 1) {
  ------------------
  |  Branch (703:4): [True: 0, False: 0]
  ------------------
  704|      0|			VIPS_DEBUG_MSG("shrinking thread pool\n");
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  705|      0|			g_atomic_int_inc(&pool->exit);
  ------------------
  |  |  143|      0|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|      0|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  144|      0|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|      0|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  145|      0|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (145:13): [Folded - Ignored]
  |  |  ------------------
  |  |  146|      0|    (void) __atomic_fetch_add ((atomic), 1, __ATOMIC_SEQ_CST);               \
  |  |  147|      0|  }))
  ------------------
  706|      0|			n_working -= 1;
  707|      0|		}
  708|  15.7k|		else if (n_waiting < 2 &&
  ------------------
  |  Branch (708:12): [True: 15.7k, False: 0]
  ------------------
  709|  15.7k|			n_working < pool->max_workers) {
  ------------------
  |  Branch (709:4): [True: 0, False: 15.7k]
  ------------------
  710|      0|			VIPS_DEBUG_MSG("expanding thread pool\n");
  ------------------
  |  |   47|      0|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      0|	{ \
  |  |   49|      0|		; \
  |  |   50|      0|	} \
  |  |   51|      0|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  711|      0|			if (vips_worker_new(pool)) {
  ------------------
  |  Branch (711:8): [True: 0, False: 0]
  ------------------
  712|      0|				vips_threadpool_free(pool);
  713|      0|				return -1;
  714|      0|			}
  715|      0|			n_working += 1;
  716|      0|		}
  717|  15.7k|	}
  718|       |
  719|       |	/* This will block until the last worker completes.
  720|       |	 */
  721|  28.4k|	vips_threadpool_wait(pool);
  722|       |
  723|       |	/* Return 0 for success.
  724|       |	 */
  725|  28.4k|	result = pool->error ? -1 : 0;
  ------------------
  |  Branch (725:11): [True: 12.4k, False: 16.0k]
  ------------------
  726|       |
  727|  28.4k|	vips_threadpool_free(pool);
  728|       |
  729|  28.4k|	if (!vips_image_get_concurrency(im, 0))
  ------------------
  |  Branch (729:6): [True: 28.4k, False: 0]
  ------------------
  730|  28.4k|		g_info("threadpool completed with %d workers", n_working);
  ------------------
  |  |  341|  28.4k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  28.4k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|  28.4k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|  28.4k|                               __VA_ARGS__)
  ------------------
  731|       |
  732|       |	/* "minimise" is only emitted for top-level threadpools.
  733|       |	 */
  734|  28.4k|	if (!vips_image_get_typeof(im, "vips-no-minimise"))
  ------------------
  |  Branch (734:6): [True: 28.4k, False: 0]
  ------------------
  735|  28.4k|		vips_image_minimise_all(im);
  736|       |
  737|  28.4k|	return result;
  738|  28.4k|}
threadpool.c:vips_thread_state_class_init:
  185|      1|{
  186|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  187|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  188|       |
  189|      1|	gobject_class->dispose = vips_thread_state_dispose;
  190|       |
  191|      1|	object_class->build = vips_thread_state_build;
  192|      1|	object_class->nickname = "threadstate";
  193|      1|	object_class->description = _("per-thread state for vipsthreadpool");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  194|      1|}
threadpool.c:vips_thread_state_dispose:
  161|  28.4k|{
  162|  28.4k|	VipsThreadState *state = (VipsThreadState *) gobject;
  163|       |
  164|  28.4k|	VIPS_DEBUG_MSG("vips_thread_state_dispose:\n");
  ------------------
  |  |   47|  28.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  28.4k|	{ \
  |  |   49|  28.4k|		; \
  |  |   50|  28.4k|	} \
  |  |   51|  28.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  165|       |
  166|  28.4k|	VIPS_UNREF(state->reg);
  ------------------
  |  |   57|  28.4k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  28.4k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  28.4k|	{ \
  |  |  |  |   43|  28.4k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 28.4k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  28.4k|			(void) F((S)); \
  |  |  |  |   45|  28.4k|			(S) = 0; \
  |  |  |  |   46|  28.4k|		} \
  |  |  |  |   47|  28.4k|	} \
  |  |  |  |   48|  28.4k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  167|       |
  168|  28.4k|	G_OBJECT_CLASS(vips_thread_state_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  28.4k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  28.4k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  28.4k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  169|  28.4k|}
threadpool.c:vips_thread_state_build:
  173|  28.4k|{
  174|  28.4k|	VipsThreadState *state = (VipsThreadState *) object;
  175|       |
  176|  28.4k|	if (!(state->reg = vips_region_new(state->im)))
  ------------------
  |  Branch (176:6): [True: 0, False: 28.4k]
  ------------------
  177|      0|		return -1;
  178|       |
  179|  28.4k|	return VIPS_OBJECT_CLASS(vips_thread_state_parent_class)
  ------------------
  |  |  435|  28.4k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  28.4k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  28.4k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|  28.4k|		->build(object);
  181|  28.4k|}
threadpool.c:vips_thread_state_init:
  198|  28.4k|{
  199|  28.4k|	VIPS_DEBUG_MSG("vips_thread_state_init:\n");
  ------------------
  |  |   47|  28.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  28.4k|	{ \
  |  |   49|  28.4k|		; \
  |  |   50|  28.4k|	} \
  |  |   51|  28.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  200|       |
  201|  28.4k|	state->reg = NULL;
  202|  28.4k|	state->stop = FALSE;
  ------------------
  |  |  794|  28.4k|#define	FALSE	(0)
  ------------------
  203|  28.4k|	state->stall = FALSE;
  ------------------
  |  |  794|  28.4k|#define	FALSE	(0)
  ------------------
  204|  28.4k|}
threadpool.c:vips_threadpool_new:
  502|  28.4k|{
  503|  28.4k|	VipsThreadpool *pool;
  504|  28.4k|	int tile_width;
  505|  28.4k|	int tile_height;
  506|  28.4k|	gint64 n_tiles;
  507|  28.4k|	int n_lines;
  508|       |
  509|       |	/* Allocate and init new thread block.
  510|       |	 */
  511|  28.4k|	if (!(pool = VIPS_NEW(NULL, VipsThreadpool)))
  ------------------
  |  |   70|  28.4k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  28.4k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  28.4k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  28.4k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  28.4k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (511:6): [True: 0, False: 28.4k]
  ------------------
  512|      0|		return NULL;
  513|  28.4k|	pool->im = im;
  514|  28.4k|	pool->allocate = NULL;
  515|  28.4k|	pool->work = NULL;
  516|  28.4k|	pool->allocate_lock = vips_g_mutex_new();
  517|  28.4k|	pool->max_workers = vips_concurrency_get();
  518|  28.4k|	vips_semaphore_init(&pool->n_workers, 0, "n_workers");
  519|  28.4k|	vips_semaphore_init(&pool->tick, 0, "tick");
  520|  28.4k|	pool->error = FALSE;
  ------------------
  |  |  794|  28.4k|#define	FALSE	(0)
  ------------------
  521|  28.4k|	pool->stop = FALSE;
  ------------------
  |  |  794|  28.4k|#define	FALSE	(0)
  ------------------
  522|  28.4k|	pool->exit = 0;
  523|       |
  524|       |	/* If this is a tiny image, we won't need all max_workers threads.
  525|       |	 * Guess how
  526|       |	 * many tiles we might need to cover the image and use that to limit
  527|       |	 * the number of threads we create.
  528|       |	 */
  529|  28.4k|	vips_get_tile_size(im, &tile_width, &tile_height, &n_lines);
  530|  28.4k|	n_tiles = (1 + (gint64) im->Xsize / tile_width) *
  531|  28.4k|		(1 + (gint64) im->Ysize / tile_height);
  532|  28.4k|	n_tiles = VIPS_CLIP(1, n_tiles, 1024);
  ------------------
  |  |   57|  28.4k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  56.8k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 28.4k]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 28.4k]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 28.4k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  533|  28.4k|	pool->max_workers = VIPS_MIN(pool->max_workers, n_tiles);
  ------------------
  |  |   55|  28.4k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 27.6k, False: 823]
  |  |  ------------------
  ------------------
  534|       |
  535|       |	/* VIPS_META_CONCURRENCY on the image can optionally override
  536|       |	 * concurrency.
  537|       |	 */
  538|  28.4k|	pool->max_workers = vips_image_get_concurrency(im, pool->max_workers);
  539|       |
  540|  28.4k|	VIPS_DEBUG_MSG("vips_threadpool_new: \"%s\" (%p), with %d threads\n",
  ------------------
  |  |   47|  28.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  28.4k|	{ \
  |  |   49|  28.4k|		; \
  |  |   50|  28.4k|	} \
  |  |   51|  28.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  541|  28.4k|		im->filename, pool, pool->max_workers);
  542|       |
  543|  28.4k|	return pool;
  544|  28.4k|}
threadpool.c:vips_worker_new:
  428|  28.4k|{
  429|  28.4k|	VipsWorker *worker;
  430|       |
  431|  28.4k|	if (!(worker = VIPS_NEW(NULL, VipsWorker)))
  ------------------
  |  |   70|  28.4k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  28.4k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  28.4k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  28.4k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  28.4k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (431:6): [True: 0, False: 28.4k]
  ------------------
  432|      0|		return -1;
  433|  28.4k|	worker->pool = pool;
  434|  28.4k|	worker->state = NULL;
  435|       |
  436|       |	/* We can't build the state here, it has to be done by the worker
  437|       |	 * itself the first time that allocate runs so that any regions are
  438|       |	 * owned by the correct thread.
  439|       |	 */
  440|       |
  441|  28.4k|	if (vips_thread_execute("worker", vips_thread_main_loop, worker)) {
  ------------------
  |  Branch (441:6): [True: 0, False: 28.4k]
  ------------------
  442|      0|		g_free(worker);
  443|      0|		return -1;
  444|      0|	}
  445|       |
  446|       |	/* One more worker in the pool.
  447|       |	 */
  448|  28.4k|	vips_semaphore_upn(&pool->n_workers, -1);
  449|       |
  450|  28.4k|	return 0;
  451|  28.4k|}
threadpool.c:vips_thread_main_loop:
  383|  28.4k|{
  384|  28.4k|	VipsWorker *worker = (VipsWorker *) a;
  385|  28.4k|	VipsThreadpool *pool = worker->pool;
  386|       |
  387|  28.4k|	g_assert(pool == worker->pool);
  ------------------
  |  |  166|  28.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  388|       |
  389|  28.4k|	VIPS_GATE_START("vips_thread_main_loop: thread");
  ------------------
  |  |   41|  28.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  28.4k|	{ \
  |  |   43|  28.4k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 28.4k]
  |  |  ------------------
  |  |   44|  28.4k|			vips__thread_gate_start(NAME); \
  |  |   45|  28.4k|	} \
  |  |   46|  28.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  390|       |
  391|  28.4k|	g_private_set(&worker_key, worker);
  392|       |
  393|       |	/* Process work units! Always tick, even if we are stopping, so the
  394|       |	 * main thread will wake up for exit.
  395|       |	 */
  396|  93.2k|	while (!pool->stop &&
  ------------------
  |  Branch (396:9): [True: 77.2k, False: 16.0k]
  ------------------
  397|  93.2k|		!worker->stop &&
  ------------------
  |  Branch (397:3): [True: 64.8k, False: 12.4k]
  ------------------
  398|  93.2k|		!pool->error) {
  ------------------
  |  Branch (398:3): [True: 64.8k, False: 0]
  ------------------
  399|  64.8k|		VIPS_GATE_START("vips_worker_work_unit: u");
  ------------------
  |  |   41|  64.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  64.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  64.8k|	{ \
  |  |   43|  64.8k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 64.8k]
  |  |  ------------------
  |  |   44|  64.8k|			vips__thread_gate_start(NAME); \
  |  |   45|  64.8k|	} \
  |  |   46|  64.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  64.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  400|  64.8k|		vips_worker_work_unit(worker);
  401|  64.8k|		VIPS_GATE_STOP("vips_worker_work_unit: u");
  ------------------
  |  |   49|  64.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  64.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  64.8k|	{ \
  |  |   51|  64.8k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 64.8k]
  |  |  ------------------
  |  |   52|  64.8k|			vips__thread_gate_stop(NAME); \
  |  |   53|  64.8k|	} \
  |  |   54|  64.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  64.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  402|  64.8k|		vips_semaphore_up(&pool->tick);
  403|  64.8k|	}
  404|       |
  405|  28.4k|	VIPS_GATE_STOP("vips_thread_main_loop: thread");
  ------------------
  |  |   49|  28.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  28.4k|	{ \
  |  |   51|  28.4k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 28.4k]
  |  |  ------------------
  |  |   52|  28.4k|			vips__thread_gate_stop(NAME); \
  |  |   53|  28.4k|	} \
  |  |   54|  28.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  406|       |
  407|       |	/* unreffing the worker state will trigger stop in the threadstate, so
  408|       |	 * we need to single-thread.
  409|       |	 */
  410|  28.4k|	g_mutex_lock(pool->allocate_lock);
  411|       |
  412|  28.4k|	VIPS_FREEF(g_object_unref, worker->state);
  ------------------
  |  |   41|  28.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  28.4k|	{ \
  |  |   43|  28.4k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 28.4k, False: 0]
  |  |  ------------------
  |  |   44|  28.4k|			(void) F((S)); \
  |  |   45|  28.4k|			(S) = 0; \
  |  |   46|  28.4k|		} \
  |  |   47|  28.4k|	} \
  |  |   48|  28.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  413|       |
  414|  28.4k|	g_mutex_unlock(pool->allocate_lock);
  415|       |
  416|  28.4k|	VIPS_FREE(worker);
  ------------------
  |  |   50|  28.4k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  28.4k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  28.4k|	{ \
  |  |  |  |   43|  28.4k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 28.4k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  28.4k|			(void) F((S)); \
  |  |  |  |   45|  28.4k|			(S) = 0; \
  |  |  |  |   46|  28.4k|		} \
  |  |  |  |   47|  28.4k|	} \
  |  |  |  |   48|  28.4k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  417|  28.4k|	g_private_set(&worker_key, NULL);
  418|       |
  419|       |	/* We are done: tell the main thread.
  420|       |	 */
  421|  28.4k|	vips_semaphore_upn(&pool->n_workers, 1);
  422|  28.4k|}
threadpool.c:vips_worker_work_unit:
  309|  64.8k|{
  310|  64.8k|	VipsThreadpool *pool = worker->pool;
  311|       |
  312|  64.8k|	VIPS_GATE_START("vips_worker_work_unit: wait");
  ------------------
  |  |   41|  64.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  64.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  64.8k|	{ \
  |  |   43|  64.8k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 64.8k]
  |  |  ------------------
  |  |   44|  64.8k|			vips__thread_gate_start(NAME); \
  |  |   45|  64.8k|	} \
  |  |   46|  64.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  64.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  313|       |
  314|  64.8k|	vips__worker_lock(pool->allocate_lock);
  315|       |
  316|  64.8k|	VIPS_GATE_STOP("vips_worker_work_unit: wait");
  ------------------
  |  |   49|  64.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  64.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  64.8k|	{ \
  |  |   51|  64.8k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 64.8k]
  |  |  ------------------
  |  |   52|  64.8k|			vips__thread_gate_stop(NAME); \
  |  |   53|  64.8k|	} \
  |  |   54|  64.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  64.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  317|       |
  318|       |	/* Has another worker signaled stop while we've been waiting?
  319|       |	 */
  320|  64.8k|	if (pool->stop) {
  ------------------
  |  Branch (320:6): [True: 0, False: 64.8k]
  ------------------
  321|      0|		worker->stop = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  322|      0|		g_mutex_unlock(pool->allocate_lock);
  323|      0|		return;
  324|      0|	}
  325|       |
  326|       |	/* Has a thread been asked to exit? Volunteer if yes.
  327|       |	 */
  328|  64.8k|	if (g_atomic_int_add(&pool->exit, -1) > 0) {
  ------------------
  |  |  162|  64.8k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|  64.8k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  163|  64.8k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|  64.8k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  164|  64.8k|    (void) (0 ? *(atomic) ^ (val) : 1);                                      \
  |  |  ------------------
  |  |  |  Branch (164:13): [Folded - Ignored]
  |  |  ------------------
  |  |  165|  64.8k|    (gint) __atomic_fetch_add ((atomic), (val), __ATOMIC_SEQ_CST);           \
  |  |  166|  64.8k|  }))
  ------------------
  |  Branch (328:6): [True: 0, False: 64.8k]
  ------------------
  329|       |		/* A thread had been asked to exit, and we've grabbed the
  330|       |		 * flag.
  331|       |		 */
  332|      0|		worker->stop = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  333|      0|		g_mutex_unlock(pool->allocate_lock);
  334|      0|		return;
  335|      0|	}
  336|  64.8k|	else {
  337|       |		/* No one had been asked to exit and we've mistakenly taken
  338|       |		 * the exit count below zero. Put it back up again.
  339|       |		 */
  340|  64.8k|		g_atomic_int_inc(&pool->exit);
  ------------------
  |  |  143|  64.8k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|  64.8k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  144|  64.8k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|  64.8k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  145|  64.8k|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (145:13): [Folded - Ignored]
  |  |  ------------------
  |  |  146|  64.8k|    (void) __atomic_fetch_add ((atomic), 1, __ATOMIC_SEQ_CST);               \
  |  |  147|  64.8k|  }))
  ------------------
  341|  64.8k|	}
  342|       |
  343|  64.8k|	if (vips_worker_allocate(worker)) {
  ------------------
  |  Branch (343:6): [True: 0, False: 64.8k]
  ------------------
  344|      0|		pool->error = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  345|      0|		worker->stop = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  346|      0|		g_mutex_unlock(pool->allocate_lock);
  347|      0|		return;
  348|      0|	}
  349|       |
  350|       |	/* Have we just signalled stop?
  351|       |	 */
  352|  64.8k|	if (pool->stop) {
  ------------------
  |  Branch (352:6): [True: 16.0k, False: 48.8k]
  ------------------
  353|  16.0k|		worker->stop = TRUE;
  ------------------
  |  |  798|  16.0k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  16.0k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  354|  16.0k|		g_mutex_unlock(pool->allocate_lock);
  355|  16.0k|		return;
  356|  16.0k|	}
  357|       |
  358|  48.8k|	g_mutex_unlock(pool->allocate_lock);
  359|       |
  360|  48.8k|	if (worker->state->stall &&
  ------------------
  |  Branch (360:6): [True: 0, False: 48.8k]
  ------------------
  361|  48.8k|		vips__stall) {
  ------------------
  |  Branch (361:3): [True: 0, False: 0]
  ------------------
  362|       |		/* Sleep for 0.5s. Handy for stressing the seq system. Stall
  363|       |		 * is set by allocate funcs in various places.
  364|       |		 */
  365|      0|		g_usleep(500000);
  366|      0|		worker->state->stall = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  367|      0|		printf("vips_worker_work_unit: stall done, releasing y = %d ...\n",
  368|      0|			worker->state->y);
  369|      0|	}
  370|       |
  371|       |	/* Process a work unit.
  372|       |	 */
  373|  48.8k|	if (pool->work(worker->state, pool->a)) {
  ------------------
  |  Branch (373:6): [True: 12.4k, False: 36.4k]
  ------------------
  374|  12.4k|		worker->stop = TRUE;
  ------------------
  |  |  798|  12.4k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  12.4k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  375|  12.4k|		pool->error = TRUE;
  ------------------
  |  |  798|  12.4k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  12.4k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  376|  12.4k|	}
  377|  48.8k|}
threadpool.c:vips_worker_allocate:
  289|  64.8k|{
  290|  64.8k|	VipsThreadpool *pool = worker->pool;
  291|       |
  292|  64.8k|	g_assert(!pool->stop);
  ------------------
  |  |  166|  64.8k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  64.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  64.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  293|       |
  294|  64.8k|	if (!worker->state &&
  ------------------
  |  Branch (294:6): [True: 28.4k, False: 36.4k]
  ------------------
  295|  64.8k|		!(worker->state = pool->start(pool->im, pool->a)))
  ------------------
  |  Branch (295:3): [True: 0, False: 28.4k]
  ------------------
  296|      0|		return -1;
  297|       |
  298|  64.8k|	if (pool->allocate(worker->state, pool->a, &pool->stop))
  ------------------
  |  Branch (298:6): [True: 0, False: 64.8k]
  ------------------
  299|      0|		return -1;
  300|       |
  301|  64.8k|	return 0;
  302|  64.8k|}
threadpool.c:vips_threadpool_free:
  488|  28.4k|{
  489|  28.4k|	VIPS_DEBUG_MSG("vips_threadpool_free: \"%s\" (%p)\n",
  ------------------
  |  |   47|  28.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  28.4k|	{ \
  |  |   49|  28.4k|		; \
  |  |   50|  28.4k|	} \
  |  |   51|  28.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  490|  28.4k|		pool->im->filename, pool);
  491|       |
  492|  28.4k|	vips_threadpool_wait(pool);
  493|       |
  494|  28.4k|	VIPS_FREEF(vips_g_mutex_free, pool->allocate_lock);
  ------------------
  |  |   41|  28.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  28.4k|	{ \
  |  |   43|  28.4k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 28.4k, False: 0]
  |  |  ------------------
  |  |   44|  28.4k|			(void) F((S)); \
  |  |   45|  28.4k|			(S) = 0; \
  |  |   46|  28.4k|		} \
  |  |   47|  28.4k|	} \
  |  |   48|  28.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  495|  28.4k|	vips_semaphore_destroy(&pool->n_workers);
  496|  28.4k|	vips_semaphore_destroy(&pool->tick);
  497|  28.4k|	VIPS_FREE(pool);
  ------------------
  |  |   50|  28.4k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  28.4k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  28.4k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  28.4k|	{ \
  |  |  |  |   43|  28.4k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 28.4k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  28.4k|			(void) F((S)); \
  |  |  |  |   45|  28.4k|			(S) = 0; \
  |  |  |  |   46|  28.4k|		} \
  |  |  |  |   47|  28.4k|	} \
  |  |  |  |   48|  28.4k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  28.4k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  498|  28.4k|}
threadpool.c:vips_threadpool_wait:
  479|  56.8k|{
  480|       |	/* Wait for them all to exit.
  481|       |	 */
  482|  56.8k|	pool->stop = TRUE;
  ------------------
  |  |  798|  56.8k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  56.8k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  483|  56.8k|	vips_semaphore_downn(&pool->n_workers, 0);
  484|  56.8k|}

vips_threadset_new:
  266|      2|{
  267|      2|	VipsThreadset *set;
  268|       |
  269|      2|	set = g_new0(VipsThreadset, 1);
  ------------------
  |  |  299|      2|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|      2|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|      2|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|      2|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|      2|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|      2|	  gpointer __p;						\
  |  |  |  |  231|      2|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  |  |  232|      2|	    __p = g_##func (__n);				\
  |  |  |  |  233|      2|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 2, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|      2|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 2]
  |  |  |  |  |  Branch (234:26): [True: 2, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|      2|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|      2|	  else							\
  |  |  |  |  237|      2|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|      2|	  __p;							\
  |  |  |  |  239|      2|	}))
  |  |  ------------------
  ------------------
  270|      2|	set->queue = g_async_queue_new();
  271|      2|	vips_semaphore_init(&set->idle, 0, "idle");
  272|      2|	set->max_threads = max_threads;
  273|       |
  274|      2|	if (set->max_threads > 0)
  ------------------
  |  Branch (274:6): [True: 0, False: 2]
  ------------------
  275|      0|		for (int i = 0; i < set->max_threads; i++) {
  ------------------
  |  Branch (275:19): [True: 0, False: 0]
  ------------------
  276|      0|			if (!vips_threadset_add_thread(set)) {
  ------------------
  |  Branch (276:8): [True: 0, False: 0]
  ------------------
  277|      0|				vips_threadset_free(set);
  278|      0|				return NULL;
  279|      0|			}
  280|      0|		}
  281|       |
  282|      2|	return set;
  283|      2|}
vips_threadset_run:
  303|  50.2k|{
  304|  50.2k|	VipsThreadExec *task;
  305|       |
  306|  50.2k|	g_async_queue_lock(set->queue);
  307|       |
  308|       |	/* Create a new thread if there are no waiting threads in the queue.
  309|       |	 */
  310|  50.2k|	if (g_async_queue_length_unlocked(set->queue) >= 0)
  ------------------
  |  Branch (310:6): [True: 16, False: 50.2k]
  ------------------
  311|     16|		if (!vips_threadset_add_thread(set)) {
  ------------------
  |  Branch (311:7): [True: 0, False: 16]
  ------------------
  312|      0|			g_async_queue_unlock(set->queue);
  313|       |
  314|       |			/* Thread create has failed.
  315|       |			 */
  316|      0|			return -1;
  317|      0|		}
  318|       |
  319|       |	/* Allocate the task and push it into the queue.
  320|       |	 */
  321|  50.2k|	task = g_new0(VipsThreadExec, 1);
  ------------------
  |  |  299|  50.2k|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|  50.2k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  50.2k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  50.2k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  50.2k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  50.2k|	  gpointer __p;						\
  |  |  |  |  231|  50.2k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 50.2k]
  |  |  |  |  ------------------
  |  |  |  |  232|  50.2k|	    __p = g_##func (__n);				\
  |  |  |  |  233|  50.2k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 50.2k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  50.2k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 50.2k]
  |  |  |  |  |  Branch (234:26): [True: 50.2k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  50.2k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  50.2k|	  else							\
  |  |  |  |  237|  50.2k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  50.2k|	  __p;							\
  |  |  |  |  239|  50.2k|	}))
  |  |  ------------------
  ------------------
  322|  50.2k|	task->domain = domain;
  323|  50.2k|	task->func = func;
  324|  50.2k|	task->data = data;
  325|       |
  326|  50.2k|	g_async_queue_push_unlocked(set->queue, task);
  327|  50.2k|	g_async_queue_unlock(set->queue);
  328|       |
  329|  50.2k|	return 0;
  330|  50.2k|}
threadset.c:vips_threadset_add_thread:
  212|     16|{
  213|     16|	gboolean reused = FALSE;
  ------------------
  |  |  794|     16|#define	FALSE	(0)
  ------------------
  214|       |
  215|       |	/* There are already sufficient threads running.
  216|       |	 */
  217|     16|	if (set->max_threads > 0 &&
  ------------------
  |  Branch (217:6): [True: 0, False: 16]
  ------------------
  218|     16|		set->n_threads >= set->max_threads)
  ------------------
  |  Branch (218:3): [True: 0, False: 0]
  ------------------
  219|      0|		return TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  220|       |
  221|     16|	if (set->n_idle_threads > 0) {
  ------------------
  |  Branch (221:6): [True: 6, False: 10]
  ------------------
  222|      6|		vips_semaphore_up(&set->idle);
  223|       |
  224|      6|		set->n_idle_threads--;
  225|      6|		reused = TRUE;
  ------------------
  |  |  798|      6|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      6|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  226|      6|	}
  227|       |
  228|     16|	if (!reused) {
  ------------------
  |  Branch (228:6): [True: 10, False: 6]
  ------------------
  229|       |		/* No idle thread was found, we have to start a new one.
  230|       |		 */
  231|     10|		GThread *thread;
  232|       |
  233|     10|		if (!(thread = vips_g_thread_new("libvips worker",
  ------------------
  |  Branch (233:7): [True: 0, False: 10]
  ------------------
  234|     10|				  vips_threadset_work, set)))
  235|      0|			return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  236|       |
  237|       |		/* Ensure threads are freed on exit.
  238|       |		 */
  239|     10|		g_thread_unref(thread);
  240|       |
  241|     10|		set->n_threads++;
  242|     10|		set->n_threads_highwater =
  243|     10|			VIPS_MAX(set->n_threads_highwater, set->n_threads);
  ------------------
  |  |   54|     10|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 3, False: 7]
  |  |  ------------------
  ------------------
  244|     10|	}
  245|       |
  246|     16|	return TRUE;
  ------------------
  |  |  798|     16|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|     16|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  247|     16|}
threadset.c:vips_threadset_work:
  133|     10|{
  134|     10|	VipsThreadset *set = (VipsThreadset *) pointer;
  135|     10|	gboolean cleanup = FALSE;
  ------------------
  |  |  794|     10|#define	FALSE	(0)
  ------------------
  136|       |
  137|     10|	VIPS_DEBUG_MSG("vips_threadset_work: starting %p\n", g_thread_self());
  ------------------
  |  |   47|     10|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     10|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|     10|	{ \
  |  |   49|     10|		; \
  |  |   50|     10|	} \
  |  |   51|     10|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     10|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  138|       |
  139|     10|	g_async_queue_lock(set->queue);
  140|       |
  141|  50.2k|	for (;;) {
  142|       |		/* Pop a task from the queue. If the number of threads is limited,
  143|       |		 * this will block until a task becomes available. Otherwise, it
  144|       |		 * waits for at least 1/2 second before being marked as idle.
  145|       |		 */
  146|  50.2k|		VipsThreadExec *task = set->max_threads > 0
  ------------------
  |  Branch (146:26): [True: 0, False: 50.2k]
  ------------------
  147|  50.2k|			? g_async_queue_pop_unlocked(set->queue)
  148|  50.2k|			: g_async_queue_timeout_pop_unlocked(set->queue,
  149|  50.2k|				  G_USEC_PER_SEC / 2);
  ------------------
  |  |   42|  50.2k|#define G_USEC_PER_SEC 1000000
  ------------------
  150|       |
  151|       |		/* Request to exit? Leave this thread.
  152|       |		 */
  153|  50.2k|		if (set->exit) {
  ------------------
  |  Branch (153:7): [True: 0, False: 50.2k]
  ------------------
  154|       |			/* The last thread should cleanup the set.
  155|       |			 */
  156|      0|			cleanup = set->n_threads == 1;
  157|      0|			break;
  158|      0|		}
  159|       |
  160|       |		/* No task available? Wait for being reused.
  161|       |		 */
  162|  50.2k|		if (task == NULL) {
  ------------------
  |  Branch (162:7): [True: 12, False: 50.2k]
  ------------------
  163|     12|			if (!vips_threadset_reuse_wait(set)) {
  ------------------
  |  Branch (163:8): [True: 6, False: 6]
  ------------------
  164|      6|				set->n_idle_threads--;
  165|      6|				break;
  166|      6|			}
  167|       |
  168|      6|			continue;
  169|     12|		}
  170|       |
  171|       |		/* A task was received and there was no request to exit.
  172|       |		 */
  173|  50.2k|		g_async_queue_unlock(set->queue);
  174|       |
  175|       |		/* If we're profiling, attach a prof struct to this thread.
  176|       |		 */
  177|  50.2k|		if (vips__thread_profile)
  ------------------
  |  Branch (177:7): [True: 0, False: 50.2k]
  ------------------
  178|      0|			vips__thread_profile_attach(task->domain);
  179|       |
  180|       |		/* Execute the task.
  181|       |		 */
  182|  50.2k|		task->func(task->data, NULL);
  183|       |
  184|       |		/* Free any thread-private resources -- they will not be
  185|       |		 * useful for the next task to use this thread.
  186|       |		 */
  187|  50.2k|		vips_thread_shutdown();
  188|  50.2k|		VIPS_FREE(task);
  ------------------
  |  |   50|  50.2k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  50.2k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  50.2k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  50.2k|	{ \
  |  |  |  |   43|  50.2k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 50.2k, False: 4]
  |  |  |  |  ------------------
  |  |  |  |   44|  50.2k|			(void) F((S)); \
  |  |  |  |   45|  50.2k|			(S) = 0; \
  |  |  |  |   46|  50.2k|		} \
  |  |  |  |   47|  50.2k|	} \
  |  |  |  |   48|  50.2k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  50.2k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|       |
  190|  50.2k|		g_async_queue_lock(set->queue);
  191|  50.2k|	}
  192|       |
  193|       |	/* Timed-out or exit has been requested, decrement number of threads.
  194|       |	 */
  195|     10|	set->n_threads--;
  196|     10|	VIPS_DEBUG_MSG(
  ------------------
  |  |   47|     10|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     10|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|     10|	{ \
  |  |   49|     10|		; \
  |  |   50|     10|	} \
  |  |   51|     10|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     10|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  197|     10|		"vips_threadset_work: stopping %p (%d remaining, %d idle)\n",
  198|     10|		g_thread_self(), set->n_threads, set->n_idle_threads);
  199|       |
  200|     10|	g_async_queue_unlock(set->queue);
  201|       |
  202|     10|	if (cleanup)
  ------------------
  |  Branch (202:6): [True: 0, False: 10]
  ------------------
  203|      0|		vips_threadset_free_internal(set);
  204|       |
  205|     10|	return NULL;
  206|     10|}
threadset.c:vips_threadset_reuse_wait:
  102|     12|{
  103|     12|	int result;
  104|       |
  105|       |	/* A superfluous thread? Leave this thread.
  106|       |	 */
  107|     12|	if (++set->n_idle_threads > max_idle_threads)
  ------------------
  |  Branch (107:6): [True: 6, False: 6]
  ------------------
  108|      6|		return FALSE;
  ------------------
  |  |  794|      6|#define	FALSE	(0)
  ------------------
  109|       |
  110|      6|	g_async_queue_unlock(set->queue);
  111|       |
  112|       |	/* Wait for at least 15 seconds before leaving this thread.
  113|       |	 */
  114|      6|	result = vips_semaphore_down_timeout(&set->idle, max_idle_time);
  115|       |
  116|      6|	g_async_queue_lock(set->queue);
  117|       |
  118|      6|	return result != -1;
  119|     12|}

vips_area_copy:
  139|  1.53M|{
  140|  1.53M|	g_mutex_lock(area->lock);
  141|       |
  142|  1.53M|	g_assert(area->count > 0);
  ------------------
  |  |  166|  1.53M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.53M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.53M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  143|       |
  144|  1.53M|	area->count += 1;
  145|       |
  146|       |#ifdef DEBUG
  147|       |	printf("vips_area_copy: %p count = %d\n", area, area->count);
  148|       |#endif /*DEBUG*/
  149|       |
  150|  1.53M|	g_mutex_unlock(area->lock);
  151|       |
  152|  1.53M|	return area;
  153|  1.53M|}
vips_area_free_cb:
  157|   234k|{
  158|   234k|	g_free(mem);
  159|       |
  160|   234k|	return 0;
  161|   234k|}
vips_area_unref:
  177|  1.89M|{
  178|  1.89M|	g_mutex_lock(area->lock);
  179|       |
  180|  1.89M|	g_assert(area->count > 0);
  ------------------
  |  |  166|  1.89M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.89M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.89M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  181|       |
  182|  1.89M|	area->count -= 1;
  183|       |
  184|       |#ifdef DEBUG
  185|       |	printf("vips_area_unref: %p count = %d\n", area, area->count);
  186|       |#endif /*DEBUG*/
  187|       |
  188|  1.89M|	if (vips__leak) {
  ------------------
  |  Branch (188:6): [True: 0, False: 1.89M]
  ------------------
  189|      0|		g_mutex_lock(&vips__global_lock);
  190|      0|		g_assert(g_slist_find(vips_area_all, area));
  ------------------
  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  191|      0|		g_mutex_unlock(&vips__global_lock);
  192|      0|	}
  193|       |
  194|  1.89M|	if (area->count == 0) {
  ------------------
  |  Branch (194:6): [True: 352k, False: 1.53M]
  ------------------
  195|   352k|		vips_area_free(area);
  196|       |
  197|   352k|		g_mutex_unlock(area->lock);
  198|       |
  199|   352k|		VIPS_FREEF(vips_g_mutex_free, area->lock);
  ------------------
  |  |   41|   352k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   352k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   352k|	{ \
  |  |   43|   352k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 352k, False: 0]
  |  |  ------------------
  |  |   44|   352k|			(void) F((S)); \
  |  |   45|   352k|			(S) = 0; \
  |  |   46|   352k|		} \
  |  |   47|   352k|	} \
  |  |   48|   352k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   352k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  200|       |
  201|   352k|		g_free(area);
  202|       |
  203|   352k|		if (vips__leak) {
  ------------------
  |  Branch (203:7): [True: 0, False: 352k]
  ------------------
  204|      0|			g_mutex_lock(&vips__global_lock);
  205|      0|			vips_area_all = g_slist_remove(vips_area_all, area);
  206|      0|			g_mutex_unlock(&vips__global_lock);
  207|      0|		}
  208|       |
  209|       |#ifdef DEBUG
  210|       |		g_mutex_lock(&vips__global_lock);
  211|       |		printf("vips_area_unref: free .. total = %d\n",
  212|       |			g_slist_length(vips_area_all));
  213|       |		g_mutex_unlock(&vips__global_lock);
  214|       |#endif /*DEBUG*/
  215|   352k|	}
  216|  1.53M|	else
  217|  1.53M|		g_mutex_unlock(area->lock);
  218|  1.89M|}
vips_area_new:
  254|   352k|{
  255|   352k|	VipsArea *area;
  256|       |
  257|   352k|	area = g_new(VipsArea, 1);
  ------------------
  |  |  282|   352k|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|   352k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   352k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   352k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   352k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   352k|	  gpointer __p;						\
  |  |  |  |  231|   352k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 352k]
  |  |  |  |  ------------------
  |  |  |  |  232|   352k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   352k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 352k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|   352k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 352k]
  |  |  |  |  |  Branch (234:26): [True: 352k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   352k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   352k|	  else							\
  |  |  |  |  237|   352k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   352k|	  __p;							\
  |  |  |  |  239|   352k|	}))
  |  |  ------------------
  ------------------
  258|   352k|	area->count = 1;
  259|   352k|	area->lock = vips_g_mutex_new();
  260|   352k|	area->length = 0;
  261|   352k|	area->data = data;
  262|   352k|	area->free_fn = free_fn;
  263|   352k|	area->type = 0;
  264|   352k|	area->sizeof_type = 0;
  265|       |
  266|   352k|	if (vips__leak) {
  ------------------
  |  Branch (266:6): [True: 0, False: 352k]
  ------------------
  267|      0|		g_mutex_lock(&vips__global_lock);
  268|      0|		vips_area_all = g_slist_prepend(vips_area_all, area);
  269|      0|		g_mutex_unlock(&vips__global_lock);
  270|      0|	}
  271|       |
  272|       |#ifdef DEBUG
  273|       |	g_mutex_lock(&vips__global_lock);
  274|       |	printf("vips_area_new: %p count = %d (%d in total)\n",
  275|       |		area, area->count,
  276|       |		g_slist_length(vips_area_all));
  277|       |	g_mutex_unlock(&vips__global_lock);
  278|       |#endif /*DEBUG*/
  279|       |
  280|   352k|	return area;
  281|   352k|}
vips_area_new_array:
  323|  38.7k|{
  324|  38.7k|	VipsArea *area;
  325|  38.7k|	void *array;
  326|       |
  327|  38.7k|	array = g_malloc(n * sizeof_type);
  328|  38.7k|	area = vips_area_new((VipsCallbackFn) vips_area_free_cb, array);
  329|  38.7k|	area->n = n;
  330|  38.7k|	area->length = n * sizeof_type;
  331|  38.7k|	area->type = type;
  332|  38.7k|	area->sizeof_type = sizeof_type;
  333|       |
  334|  38.7k|	return area;
  335|  38.7k|}
vips_area_new_array_object:
  367|  2.52k|{
  368|  2.52k|	GObject **array;
  369|  2.52k|	VipsArea *area;
  370|       |
  371|  2.52k|	array = g_new0(GObject *, n + 1);
  ------------------
  |  |  299|  2.52k|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|  2.52k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  2.52k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  2.52k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  2.52k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  2.52k|	  gpointer __p;						\
  |  |  |  |  231|  2.52k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 2.52k]
  |  |  |  |  ------------------
  |  |  |  |  232|  2.52k|	    __p = g_##func (__n);				\
  |  |  |  |  233|  2.52k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 0, False: 2.52k]
  |  |  |  |  ------------------
  |  |  |  |  234|  2.52k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 0]
  |  |  |  |  |  Branch (234:26): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  2.52k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  2.52k|	  else							\
  |  |  |  |  237|  2.52k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  2.52k|	  __p;							\
  |  |  |  |  239|  2.52k|	}))
  |  |  ------------------
  ------------------
  372|  2.52k|	area = vips_area_new((VipsCallbackFn) vips_area_free_array_object,
  373|  2.52k|		array);
  374|  2.52k|	area->n = n;
  375|  2.52k|	area->length = n * sizeof(GObject *);
  376|  2.52k|	area->type = G_TYPE_OBJECT;
  ------------------
  |  |  178|  2.52k|#define G_TYPE_OBJECT			G_TYPE_MAKE_FUNDAMENTAL (20)
  |  |  ------------------
  |  |  |  |  221|  2.52k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  2.52k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  377|  2.52k|	area->sizeof_type = sizeof(GObject *);
  378|       |
  379|  2.52k|	return area;
  380|  2.52k|}
vips_area_get_data:
  399|   142k|{
  400|   142k|	if (!area)
  ------------------
  |  Branch (400:6): [True: 0, False: 142k]
  ------------------
  401|      0|		return NULL;
  402|       |
  403|   142k|	if (length)
  ------------------
  |  Branch (403:6): [True: 102k, False: 39.7k]
  ------------------
  404|   102k|		*length = area->length;
  405|   142k|	if (n)
  ------------------
  |  Branch (405:6): [True: 0, False: 142k]
  ------------------
  406|      0|		*n = area->n;
  407|   142k|	if (type)
  ------------------
  |  Branch (407:6): [True: 0, False: 142k]
  ------------------
  408|      0|		*type = area->type;
  409|   142k|	if (sizeof_type)
  ------------------
  |  Branch (409:6): [True: 0, False: 142k]
  ------------------
  410|      0|		*sizeof_type = area->sizeof_type;
  411|       |
  412|   142k|	return area->data;
  413|   142k|}
vips_ref_string_new:
  577|   182k|{
  578|   182k|	VipsArea *area;
  579|       |
  580|   182k|	char *utf8_str = g_utf8_make_valid(str, -1);
  581|       |
  582|   182k|	area = vips_area_new((VipsCallbackFn) vips_area_free_cb, utf8_str);
  583|       |
  584|       |	/* Handy place to cache this.
  585|       |	 */
  586|   182k|	area->length = strlen(utf8_str);
  587|       |
  588|   182k|	return (VipsRefString *) area;
  589|   182k|}
vips_blob_new:
  653|   128k|{
  654|   128k|	VipsArea *area;
  655|       |
  656|   128k|	area = vips_area_new(free_fn, (void *) data);
  657|   128k|	area->length = length;
  658|       |
  659|   128k|	return (VipsBlob *) area;
  660|   128k|}
vips_blob_get:
  702|  90.3k|{
  703|  90.3k|	return vips_area_get_data(VIPS_AREA(blob),
  ------------------
  |  |  137|  90.3k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  704|  90.3k|		length, NULL, NULL, NULL);
  705|  90.3k|}
vips_blob_set:
  724|  4.03k|{
  725|  4.03k|	VipsArea *area = VIPS_AREA(blob);
  ------------------
  |  |  137|  4.03k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  726|       |
  727|  4.03k|	g_mutex_lock(area->lock);
  728|       |
  729|  4.03k|	vips_area_free(area);
  730|       |
  731|  4.03k|	area->free_fn = free_fn;
  732|  4.03k|	area->length = length;
  733|  4.03k|	area->data = (void *) data;
  734|       |
  735|  4.03k|	g_mutex_unlock(area->lock);
  736|  4.03k|}
vips_array_double_new:
 1069|  26.2k|{
 1070|  26.2k|	VipsArea *area;
 1071|  26.2k|	double *array_copy;
 1072|       |
 1073|  26.2k|	area = vips_area_new_array(G_TYPE_DOUBLE, sizeof(double), n);
  ------------------
  |  |  148|  26.2k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|  26.2k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  26.2k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1074|  26.2k|	array_copy = vips_area_get_data(area, NULL, NULL, NULL, NULL);
 1075|  26.2k|	memcpy(array_copy, array, n * sizeof(double));
 1076|       |
 1077|  26.2k|	return (VipsArrayDouble *) area;
 1078|  26.2k|}
vips_array_double_newv:
 1094|  10.9k|{
 1095|  10.9k|	va_list ap;
 1096|  10.9k|	VipsArea *area;
 1097|  10.9k|	double *array;
 1098|  10.9k|	int i;
 1099|       |
 1100|  10.9k|	area = vips_area_new_array(G_TYPE_DOUBLE, sizeof(double), n);
  ------------------
  |  |  148|  10.9k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|  10.9k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  10.9k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1101|  10.9k|	array = vips_area_get_data(area, NULL, NULL, NULL, NULL);
 1102|       |
 1103|  10.9k|	va_start(ap, n);
 1104|  21.8k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (1104:14): [True: 10.9k, False: 10.9k]
  ------------------
 1105|  10.9k|		array[i] = va_arg(ap, double);
 1106|  10.9k|	va_end(ap);
 1107|       |
 1108|  10.9k|	return (VipsArrayDouble *) area;
 1109|  10.9k|}
vips_array_double_get:
 1122|  8.74k|{
 1123|  8.74k|	VipsArea *area = VIPS_AREA(array);
  ------------------
  |  |  137|  8.74k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1124|       |
 1125|  8.74k|	g_assert(area->type == G_TYPE_DOUBLE);
  ------------------
  |  |  166|  8.74k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  8.74k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.74k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1126|       |
 1127|  8.74k|	if (n)
  ------------------
  |  Branch (1127:6): [True: 8.74k, False: 0]
  ------------------
 1128|  8.74k|		*n = area->n;
 1129|       |
 1130|  8.74k|	return VIPS_ARRAY_ADDR(array, 0);
  ------------------
  |  |  127|  8.74k|	((void *) ((VipsPel *) VIPS_AREA(X)->data + \
  |  |  ------------------
  |  |  |  |  137|  8.74k|#define VIPS_AREA(X) ((VipsArea *) (X))
  |  |  ------------------
  |  |  128|  8.74k|		VIPS_AREA(X)->sizeof_type * (I)))
  |  |  ------------------
  |  |  |  |  137|  8.74k|#define VIPS_AREA(X) ((VipsArea *) (X))
  |  |  ------------------
  ------------------
 1131|  8.74k|}
vips_array_image_new:
 1290|  2.52k|{
 1291|  2.52k|	VipsArea *area;
 1292|  2.52k|	VipsImage **array_copy;
 1293|  2.52k|	int i;
 1294|       |
 1295|  2.52k|	area = vips_area_new_array_object(n);
 1296|  2.52k|	area->type = VIPS_TYPE_IMAGE;
  ------------------
  |  |  169|  2.52k|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  ------------------
 1297|       |
 1298|  2.52k|	array_copy = vips_area_get_data(area, NULL, NULL, NULL, NULL);
 1299|  9.63k|	for (i = 0; i < n; i++) {
  ------------------
  |  Branch (1299:14): [True: 7.10k, False: 2.52k]
  ------------------
 1300|  7.10k|		array_copy[i] = (VipsImage *) array[i];
 1301|  7.10k|		g_object_ref(array_copy[i]);
 1302|  7.10k|	}
 1303|       |
 1304|  2.52k|	return (VipsArrayImage *) area;
 1305|  2.52k|}
vips_array_image_get:
 1462|  2.52k|{
 1463|  2.52k|	VipsArea *area = VIPS_AREA(array);
  ------------------
  |  |  137|  2.52k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1464|       |
 1465|  2.52k|	g_assert(area->type == VIPS_TYPE_IMAGE);
  ------------------
  |  |  166|  2.52k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.52k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.52k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1466|       |
 1467|  2.52k|	if (n)
  ------------------
  |  Branch (1467:6): [True: 2.52k, False: 0]
  ------------------
 1468|  2.52k|		*n = area->n;
 1469|       |
 1470|  2.52k|	return (VipsImage **) VIPS_ARRAY_ADDR(array, 0);
  ------------------
  |  |  127|  2.52k|	((void *) ((VipsPel *) VIPS_AREA(X)->data + \
  |  |  ------------------
  |  |  |  |  137|  2.52k|#define VIPS_AREA(X) ((VipsArea *) (X))
  |  |  ------------------
  |  |  128|  2.52k|		VIPS_AREA(X)->sizeof_type * (I)))
  |  |  ------------------
  |  |  |  |  137|  2.52k|#define VIPS_AREA(X) ((VipsArea *) (X))
  |  |  ------------------
  ------------------
 1471|  2.52k|}
vips_value_get_area:
 1536|  12.4k|{
 1537|  12.4k|	VipsArea *area;
 1538|       |
 1539|  12.4k|	area = g_value_get_boxed(value);
 1540|       |
 1541|  12.4k|	return vips_area_get_data(area, length, NULL, NULL, NULL);
 1542|  12.4k|}
vips_value_set_ref_string:
 1631|   182k|{
 1632|   182k|	VipsRefString *ref_str;
 1633|       |
 1634|   182k|	g_assert(G_VALUE_TYPE(value) == VIPS_TYPE_REF_STRING);
  ------------------
  |  |  166|   182k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   182k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   182k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1635|       |
 1636|   182k|	ref_str = vips_ref_string_new(str);
 1637|   182k|	g_value_set_boxed(value, ref_str);
 1638|   182k|	vips_area_unref(VIPS_AREA(ref_str));
  ------------------
  |  |  137|   182k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1639|   182k|}
vips_value_set_blob:
 1662|  12.8k|{
 1663|  12.8k|	VipsBlob *blob;
 1664|       |
 1665|  12.8k|	g_assert(G_VALUE_TYPE(value) == VIPS_TYPE_BLOB);
  ------------------
  |  |  166|  12.8k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  12.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1666|       |
 1667|  12.8k|	blob = vips_blob_new(free_fn, data, length);
 1668|  12.8k|	g_value_set_boxed(value, blob);
 1669|  12.8k|	vips_area_unref(VIPS_AREA(blob));
  ------------------
  |  |  137|  12.8k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1670|  12.8k|}
vips_value_get_blob:
 1717|  12.4k|{
 1718|  12.4k|	return vips_value_get_area(value, length);
 1719|  12.4k|}
vips_value_set_array:
 1735|  1.05k|{
 1736|  1.05k|	VipsArea *area;
 1737|       |
 1738|  1.05k|	area = vips_area_new_array(type, sizeof_type, n);
 1739|  1.05k|	g_value_set_boxed(value, area);
 1740|  1.05k|	vips_area_unref(area);
 1741|  1.05k|}
vips_value_get_array:
 1761|  1.22k|{
 1762|  1.22k|	VipsArea *area;
 1763|       |
 1764|       |	/* Can't check value type, because we may get called from
 1765|       |	 * vips_*_get_type().
 1766|       |	 */
 1767|       |
 1768|  1.22k|	if (!(area = g_value_get_boxed(value)))
  ------------------
  |  Branch (1768:6): [True: 0, False: 1.22k]
  ------------------
 1769|      0|		return NULL;
 1770|  1.22k|	if (n)
  ------------------
  |  Branch (1770:6): [True: 173, False: 1.05k]
  ------------------
 1771|    173|		*n = area->n;
 1772|  1.22k|	if (type)
  ------------------
  |  Branch (1772:6): [True: 0, False: 1.22k]
  ------------------
 1773|      0|		*type = area->type;
 1774|  1.22k|	if (sizeof_type)
  ------------------
  |  Branch (1774:6): [True: 0, False: 1.22k]
  ------------------
 1775|      0|		*sizeof_type = area->sizeof_type;
 1776|       |
 1777|  1.22k|	return area->data;
 1778|  1.22k|}
vips_value_get_array_int:
 1794|    856|{
 1795|    856|	return vips_value_get_array(value, n, NULL, NULL);
 1796|    856|}
vips_value_set_array_int:
 1810|    683|{
 1811|    683|	vips_value_set_array(value, n, G_TYPE_INT, sizeof(int));
  ------------------
  |  |   94|    683|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|    683|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|    683|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1812|       |
 1813|    683|	if (array) {
  ------------------
  |  Branch (1813:6): [True: 683, False: 0]
  ------------------
 1814|    683|		int *array_copy;
 1815|       |
 1816|    683|		array_copy = vips_value_get_array_int(value, NULL);
 1817|    683|		memcpy(array_copy, array, n * sizeof(int));
 1818|    683|	}
 1819|    683|}
vips_value_get_array_double:
 1835|    367|{
 1836|    367|	return vips_value_get_array(value, n, NULL, NULL);
 1837|    367|}
vips_value_set_array_double:
 1851|    367|{
 1852|    367|	vips_value_set_array(value, n, G_TYPE_DOUBLE, sizeof(double));
  ------------------
  |  |  148|    367|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|    367|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|    367|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1853|       |
 1854|    367|	if (array) {
  ------------------
  |  Branch (1854:6): [True: 367, False: 0]
  ------------------
 1855|    367|		double *array_copy;
 1856|       |
 1857|    367|		array_copy = vips_value_get_array_double(value, NULL);
 1858|    367|		memcpy(array_copy, array, n * sizeof(double));
 1859|    367|	}
 1860|    367|}
vips__meta_init_types:
 1941|      2|{
 1942|      2|	(void) vips_thing_get_type();
 1943|      2|	(void) vips_save_string_get_type();
 1944|      2|	(void) vips_area_get_type();
 1945|      2|	(void) vips_ref_string_get_type();
 1946|      2|	(void) vips_blob_get_type();
 1947|      2|	(void) vips_array_int_get_type();
 1948|      2|	(void) vips_array_double_get_type();
 1949|      2|	(void) vips_array_image_get_type();
 1950|       |
 1951|       |	/* Register transform functions to convert between an array of
 1952|       |	 * integers and doubles. This is set here to prevent a recursive
 1953|       |	 * call chain.
 1954|       |	 */
 1955|      2|	g_value_register_transform_func(VIPS_TYPE_ARRAY_INT,
  ------------------
  |  |  221|      2|#define VIPS_TYPE_ARRAY_INT (vips_array_int_get_type())
  ------------------
 1956|      2|		VIPS_TYPE_ARRAY_DOUBLE, transform_array_int_array_double);
  ------------------
  |  |  201|      2|#define VIPS_TYPE_ARRAY_DOUBLE (vips_array_double_get_type())
  ------------------
 1957|      2|	g_value_register_transform_func(VIPS_TYPE_ARRAY_DOUBLE,
  ------------------
  |  |  201|      2|#define VIPS_TYPE_ARRAY_DOUBLE (vips_array_double_get_type())
  ------------------
 1958|      2|		VIPS_TYPE_ARRAY_INT, transform_array_double_array_int);
  ------------------
  |  |  221|      2|#define VIPS_TYPE_ARRAY_INT (vips_array_int_get_type())
  ------------------
 1959|      2|}
type.c:vips_area_free:
  165|   356k|{
  166|   356k|	if (area->free_fn &&
  ------------------
  |  Branch (166:6): [True: 236k, False: 119k]
  ------------------
  167|   356k|		area->data) {
  ------------------
  |  Branch (167:3): [True: 236k, False: 0]
  ------------------
  168|   236k|		area->free_fn(area->data, area);
  169|   236k|		area->free_fn = NULL;
  170|   236k|	}
  171|       |
  172|   356k|	area->data = NULL;
  173|   356k|}
type.c:vips_area_free_array_object:
  339|  2.52k|{
  340|  2.52k|	int i;
  341|       |
  342|  9.62k|	for (i = 0; i < area->n; i++)
  ------------------
  |  Branch (342:14): [True: 7.10k, False: 2.52k]
  ------------------
  343|  7.10k|		VIPS_FREEF(g_object_unref, array[i]);
  ------------------
  |  |   41|  7.10k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  7.10k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  7.10k|	{ \
  |  |   43|  7.10k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 7.10k, False: 0]
  |  |  ------------------
  |  |   44|  7.10k|			(void) F((S)); \
  |  |   45|  7.10k|			(S) = 0; \
  |  |   46|  7.10k|		} \
  |  |   47|  7.10k|	} \
  |  |   48|  7.10k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.10k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  344|  2.52k|	VIPS_FREE(array);
  ------------------
  |  |   50|  2.52k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  2.52k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  2.52k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  2.52k|	{ \
  |  |  |  |   43|  2.52k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 2.52k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  2.52k|			(void) F((S)); \
  |  |  |  |   45|  2.52k|			(S) = 0; \
  |  |  |  |   46|  2.52k|		} \
  |  |  |  |   47|  2.52k|	} \
  |  |  |  |   48|  2.52k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  2.52k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  345|       |
  346|  2.52k|	area->n = 0;
  347|       |
  348|  2.52k|	return 0;
  349|  2.52k|}

vips_slist_map2:
   94|  1.28M|{
   95|  1.28M|	GSList *copy;
   96|  1.28M|	GSList *i;
   97|  1.28M|	void *result;
   98|       |
   99|  1.28M|	copy = g_slist_copy(list);
  100|  1.28M|	result = NULL;
  101|  4.05M|	for (i = copy; i && !(result = fn(i->data, a, b)); i = i->next)
  ------------------
  |  Branch (101:17): [True: 2.78M, False: 1.26M]
  |  Branch (101:22): [True: 2.76M, False: 25.6k]
  ------------------
  102|  2.76M|		;
  103|  1.28M|	g_slist_free(copy);
  104|       |
  105|  1.28M|	return result;
  106|  1.28M|}
vips_iscasepostfix:
  253|   131k|{
  254|   131k|	int m = strlen(a);
  255|   131k|	int n = strlen(b);
  256|       |
  257|   131k|	if (n > m)
  ------------------
  |  Branch (257:6): [True: 10.9k, False: 120k]
  ------------------
  258|  10.9k|		return FALSE;
  ------------------
  |  |  794|  10.9k|#define	FALSE	(0)
  ------------------
  259|       |
  260|   120k|	return g_ascii_strcasecmp(a + m - n, b) == 0;
  261|   131k|}
vips_isprefix:
  269|  15.0M|{
  270|  15.0M|	int i;
  271|       |
  272|  15.5M|	for (i = 0; a[i] && b[i]; i++)
  ------------------
  |  Branch (272:14): [True: 15.5M, False: 42.3k]
  |  Branch (272:22): [True: 10.8M, False: 4.69M]
  ------------------
  273|  10.8M|		if (a[i] != b[i])
  ------------------
  |  Branch (273:7): [True: 10.2M, False: 549k]
  ------------------
  274|  10.2M|			return FALSE;
  ------------------
  |  |  794|  10.2M|#define	FALSE	(0)
  ------------------
  275|       |
  276|       |	/* If there's stuff left in a but b has finished, we must have a
  277|       |	 * mismatch.
  278|       |	 */
  279|  4.73M|	if (a[i] && !b[i])
  ------------------
  |  Branch (279:6): [True: 4.69M, False: 42.3k]
  |  Branch (279:14): [True: 4.69M, False: 0]
  ------------------
  280|  4.69M|		return FALSE;
  ------------------
  |  |  794|  4.69M|#define	FALSE	(0)
  ------------------
  281|       |
  282|  42.3k|	return TRUE;
  ------------------
  |  |  798|  42.3k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  42.3k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  283|  4.73M|}
vips_break_token:
  360|     11|{
  361|     11|	char *p;
  362|     11|	char *q;
  363|       |
  364|       |	/* Is the string empty? If yes, return NULL immediately.
  365|       |	 */
  366|     11|	if (!str ||
  ------------------
  |  Branch (366:6): [True: 0, False: 11]
  ------------------
  367|     11|		!*str)
  ------------------
  |  Branch (367:3): [True: 1, False: 10]
  ------------------
  368|      1|		return NULL;
  369|       |
  370|       |	/* Skip initial break characters.
  371|       |	 */
  372|     10|	p = str + strspn(str, brk);
  373|       |
  374|       |	/* No item?
  375|       |	 */
  376|     10|	if (!*p)
  ------------------
  |  Branch (376:6): [True: 0, False: 10]
  ------------------
  377|      0|		return NULL;
  378|       |
  379|       |	/* We have a token ... search for the first break character after the
  380|       |	 * token. strcspne() allows '\' to escape breaks, see above.
  381|       |	 */
  382|     10|	p += strcspne(p, brk);
  383|       |
  384|       |	/* Is there string left?
  385|       |	 */
  386|     10|	if (*p) {
  ------------------
  |  Branch (386:6): [True: 9, False: 1]
  ------------------
  387|       |		/* Write in an end-of-string mark and return the start of the
  388|       |		 * next token.
  389|       |		 */
  390|      9|		*p++ = '\0';
  391|      9|		p += strspn(p, brk);
  392|      9|	}
  393|       |
  394|       |	/* There may be escaped break characters in str. Loop, squashing them
  395|       |	 * out.
  396|       |	 */
  397|     10|	for (q = strchr(str, '\\'); q && *q; q = strchr(q, '\\')) {
  ------------------
  |  Branch (397:30): [True: 0, False: 10]
  |  Branch (397:35): [True: 0, False: 0]
  ------------------
  398|      0|		memmove(q, q + 1, strlen(q));
  399|       |
  400|       |		/* If there's \\, we don't want to squash out the second \.
  401|       |		 */
  402|      0|		q += 1;
  403|      0|	}
  404|       |
  405|     10|	return p;
  406|     10|}
vips_filename_suffix_match:
  413|   120k|{
  414|   120k|	char *basename;
  415|   120k|	char *q;
  416|   120k|	int result;
  417|   120k|	const char **p;
  418|       |
  419|       |	/* Drop any directory components.
  420|       |	 */
  421|   120k|	basename = g_path_get_basename(path);
  422|       |
  423|       |	/* Zap any trailing [] options.
  424|       |	 */
  425|   120k|	if ((q = (char *) vips__find_rightmost_brackets(basename)))
  ------------------
  |  Branch (425:6): [True: 0, False: 120k]
  ------------------
  426|      0|		*q = '\0';
  427|       |
  428|   120k|	result = 0;
  429|   240k|	for (p = suffixes; *p; p++)
  ------------------
  |  Branch (429:21): [True: 131k, False: 109k]
  ------------------
  430|   131k|		if (vips_iscasepostfix(basename, *p)) {
  ------------------
  |  Branch (430:7): [True: 10.9k, False: 120k]
  ------------------
  431|  10.9k|			result = 1;
  432|  10.9k|			break;
  433|  10.9k|		}
  434|       |
  435|   120k|	g_free(basename);
  436|       |
  437|   120k|	return result;
  438|   120k|}
vips__gslist_gvalue_merge:
  887|   163k|{
  888|   163k|	const GSList *i, *j;
  889|   163k|	GSList *tail;
  890|       |
  891|   163k|	tail = NULL;
  892|       |
  893|   163k|	for (i = b; i; i = i->next) {
  ------------------
  |  Branch (893:14): [True: 0, False: 163k]
  ------------------
  894|      0|		GValue *value = (GValue *) i->data;
  895|       |
  896|      0|		g_assert(G_VALUE_TYPE(value) == VIPS_TYPE_REF_STRING);
  ------------------
  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  897|       |
  898|      0|		for (j = a; j; j = j->next) {
  ------------------
  |  Branch (898:15): [True: 0, False: 0]
  ------------------
  899|      0|			GValue *value2 = (GValue *) j->data;
  900|       |
  901|      0|			g_assert(G_VALUE_TYPE(value2) ==
  ------------------
  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  902|      0|				VIPS_TYPE_REF_STRING);
  903|       |
  904|       |			/* Just do a pointer compare ... good enough 99.9% of
  905|       |			 * the time.
  906|       |			 */
  907|      0|			if (vips_value_get_ref_string(value, NULL) ==
  ------------------
  |  Branch (907:8): [True: 0, False: 0]
  ------------------
  908|      0|				vips_value_get_ref_string(value2, NULL))
  909|      0|				break;
  910|      0|		}
  911|       |
  912|      0|		if (!j)
  ------------------
  |  Branch (912:7): [True: 0, False: 0]
  ------------------
  913|      0|			tail = g_slist_prepend(tail,
  914|      0|				vips__gvalue_copy(value));
  915|      0|	}
  916|       |
  917|   163k|	a = g_slist_concat(a, g_slist_reverse(tail));
  918|       |
  919|   163k|	return a;
  920|   163k|}
vips_existsf:
 1047|     11|{
 1048|     11|	va_list ap;
 1049|     11|	char *path;
 1050|     11|	gboolean result;
 1051|       |
 1052|     11|	va_start(ap, name);
 1053|     11|	path = g_strdup_vprintf(name, ap);
 1054|     11|	va_end(ap);
 1055|       |
 1056|     11|	result = g_file_test(path, G_FILE_TEST_EXISTS);
 1057|       |
 1058|     11|	g_free(path);
 1059|       |
 1060|     11|	return result;
 1061|     11|}
vips__token_get:
 1156|   386k|{
 1157|   386k|	const char *q;
 1158|   386k|	int ch;
 1159|   386k|	int n;
 1160|       |
 1161|       |	/* string return defaults to "".
 1162|       |	 */
 1163|   386k|	if (size > 0)
  ------------------
  |  Branch (1163:6): [True: 386k, False: 0]
  ------------------
 1164|   386k|		string[0] = '\0';
 1165|       |
 1166|       |	/* Parse this token with p.
 1167|       |	 */
 1168|   386k|	if (!p)
  ------------------
  |  Branch (1168:6): [True: 0, False: 386k]
  ------------------
 1169|      0|		return NULL;
 1170|       |
 1171|       |	/* Skip initial whitespace.
 1172|       |	 */
 1173|   386k|	p += strspn(p, " \t\n\r");
 1174|   386k|	if (!p[0])
  ------------------
  |  Branch (1174:6): [True: 193k, False: 193k]
  ------------------
 1175|   193k|		return NULL;
 1176|       |
 1177|   193k|	switch ((ch = p[0])) {
 1178|  25.6k|	case '[':
  ------------------
  |  Branch (1178:2): [True: 25.6k, False: 167k]
  ------------------
 1179|  25.6k|		*token = VIPS_TOKEN_LEFT;
 1180|  25.6k|		p += 1;
 1181|  25.6k|		break;
 1182|       |
 1183|  25.6k|	case ']':
  ------------------
  |  Branch (1183:2): [True: 25.6k, False: 167k]
  ------------------
 1184|  25.6k|		*token = VIPS_TOKEN_RIGHT;
 1185|  25.6k|		p += 1;
 1186|  25.6k|		break;
 1187|       |
 1188|      0|	case '=':
  ------------------
  |  Branch (1188:2): [True: 0, False: 193k]
  ------------------
 1189|      0|		*token = VIPS_TOKEN_EQUALS;
 1190|      0|		p += 1;
 1191|      0|		break;
 1192|       |
 1193|      0|	case ',':
  ------------------
  |  Branch (1193:2): [True: 0, False: 193k]
  ------------------
 1194|      0|		*token = VIPS_TOKEN_COMMA;
 1195|      0|		p += 1;
 1196|      0|		break;
 1197|       |
 1198|      0|	case '"':
  ------------------
  |  Branch (1198:2): [True: 0, False: 193k]
  ------------------
 1199|      0|	case '\'':
  ------------------
  |  Branch (1199:2): [True: 0, False: 193k]
  ------------------
 1200|       |		/* Parse a quoted string. Copy up to " or end of string, interpret
 1201|       |		 * any \",
 1202|       |		 */
 1203|      0|		*token = VIPS_TOKEN_STRING;
 1204|       |
 1205|      0|		do {
 1206|       |			/* Move q to the next matching quote, or the end of the string.
 1207|       |			 */
 1208|      0|			if (!(q = strchr(p + 1, ch)))
  ------------------
  |  Branch (1208:8): [True: 0, False: 0]
  ------------------
 1209|      0|				q = p + strlen(p);
 1210|       |
 1211|       |			// number of characters we copy to the output
 1212|      0|			n = VIPS_MIN(q - p - 1, size - 1);
  ------------------
  |  |   55|      0|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1213|      0|			g_strlcpy(string, p + 1, n + 1);
 1214|       |
 1215|       |			/* We might have stopped at an escaped quote. If the
 1216|       |			 * char before the end is a backslash, swap it for a quote.
 1217|       |			 */
 1218|      0|			if (q[-1] == '\\')
  ------------------
  |  Branch (1218:8): [True: 0, False: 0]
  ------------------
 1219|      0|				string[n - 1] = ch;
 1220|       |
 1221|      0|			string += n;
 1222|      0|			size -= n;
 1223|      0|			p = q;
 1224|      0|		} while (p[0] && p[-1] == '\\');
  ------------------
  |  Branch (1224:12): [True: 0, False: 0]
  |  Branch (1224:20): [True: 0, False: 0]
  ------------------
 1225|       |
 1226|       |		// step over the terminating quote, if we hit one
 1227|      0|		if (p[0] == ch)
  ------------------
  |  Branch (1227:7): [True: 0, False: 0]
  ------------------
 1228|      0|			p += 1;
 1229|       |
 1230|      0|		break;
 1231|       |
 1232|   141k|	default:
  ------------------
  |  Branch (1232:2): [True: 141k, False: 51.3k]
  ------------------
 1233|       |		/* It's an unquoted string: read up to the next non-string character.
 1234|       |		 * We don't allow two strings next to each other, so the next break
 1235|       |		 * must be brackets, equals, comma.
 1236|       |		 */
 1237|   141k|		*token = VIPS_TOKEN_STRING;
 1238|   141k|		q = p + strcspn(p, "[]=,");
 1239|       |
 1240|   141k|		n = VIPS_MIN(q - p, size);
  ------------------
  |  |   55|   141k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 141k, False: 0]
  |  |  ------------------
  ------------------
 1241|   141k|		g_strlcpy(string, p, n + 1);
 1242|   141k|		p = q;
 1243|       |
 1244|       |		/* We remove leading whitespace, so we trim trailing whitespace from
 1245|       |		 * unquoted strings too. Only if the string hasn't been truncated.
 1246|       |		 */
 1247|   141k|		if (n != size)
  ------------------
  |  Branch (1247:7): [True: 141k, False: 0]
  ------------------
 1248|   141k|			while (n > 0 && g_ascii_isspace(string[n - 1])) {
  ------------------
  |  |   81|   141k|  ((g_ascii_table[(guchar) (c)] & G_ASCII_SPACE) != 0)
  |  |  ------------------
  |  |  |  Branch (81:3): [True: 0, False: 141k]
  |  |  ------------------
  ------------------
  |  Branch (1248:11): [True: 141k, False: 0]
  ------------------
 1249|      0|				string[n - 1] = '\0';
 1250|      0|				n--;
 1251|      0|			}
 1252|       |
 1253|   141k|		break;
 1254|   193k|	}
 1255|       |
 1256|   193k|	return p;
 1257|   193k|}
vips__token_must:
 1264|  51.3k|{
 1265|  51.3k|	if (!(p = vips__token_get(p, token, string, size))) {
  ------------------
  |  Branch (1265:6): [True: 0, False: 51.3k]
  ------------------
 1266|      0|		vips_error("get_token",
 1267|      0|			"%s", _("unexpected end of string"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1268|      0|		return NULL;
 1269|      0|	}
 1270|       |
 1271|  51.3k|	return p;
 1272|  51.3k|}
vips__token_need:
 1279|  25.6k|{
 1280|  25.6k|	VipsToken token;
 1281|       |
 1282|  25.6k|	if (!(p = vips__token_must(p, &token, string, size)))
  ------------------
  |  Branch (1282:6): [True: 0, False: 25.6k]
  ------------------
 1283|      0|		return NULL;
 1284|  25.6k|	if (token != need_token) {
  ------------------
  |  Branch (1284:6): [True: 0, False: 25.6k]
  ------------------
 1285|      0|		vips_error("get_token", _("expected %s, saw %s"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1286|      0|			vips_enum_nick(VIPS_TYPE_TOKEN, need_token),
  ------------------
  |  |  178|      0|#define VIPS_TYPE_TOKEN (vips_token_get_type())
  ------------------
 1287|      0|			vips_enum_nick(VIPS_TYPE_TOKEN, token));
  ------------------
  |  |  178|      0|#define VIPS_TYPE_TOKEN (vips_token_get_type())
  ------------------
 1288|      0|		return NULL;
 1289|      0|	}
 1290|       |
 1291|  25.6k|	return p;
 1292|  25.6k|}
vips__token_segment:
 1302|  25.6k|{
 1303|  25.6k|	const char *q;
 1304|       |
 1305|  25.6k|	if (!(q = vips__token_must(p, token, string, size)))
  ------------------
  |  Branch (1305:6): [True: 0, False: 25.6k]
  ------------------
 1306|      0|		return NULL;
 1307|       |
 1308|       |	/* If we stopped on [, read up to the matching ].
 1309|       |	 */
 1310|  25.6k|	if (*token == VIPS_TOKEN_STRING &&
  ------------------
  |  Branch (1310:6): [True: 0, False: 25.6k]
  ------------------
 1311|  25.6k|		q[0] == '[') {
  ------------------
  |  Branch (1311:3): [True: 0, False: 0]
  ------------------
 1312|      0|		VipsToken sub_token;
 1313|      0|		char sub_string[VIPS_PATH_MAX];
 1314|      0|		int depth;
 1315|      0|		int i;
 1316|       |
 1317|      0|		depth = 0;
 1318|      0|		do {
 1319|      0|			if (!(q = vips__token_must(q, &sub_token,
  ------------------
  |  Branch (1319:8): [True: 0, False: 0]
  ------------------
 1320|      0|					  sub_string, VIPS_PATH_MAX)))
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 1321|      0|				return NULL;
 1322|       |
 1323|      0|			switch (sub_token) {
 1324|      0|			case VIPS_TOKEN_LEFT:
  ------------------
  |  Branch (1324:4): [True: 0, False: 0]
  ------------------
 1325|      0|				depth += 1;
 1326|      0|				break;
 1327|       |
 1328|      0|			case VIPS_TOKEN_RIGHT:
  ------------------
  |  Branch (1328:4): [True: 0, False: 0]
  ------------------
 1329|      0|				depth -= 1;
 1330|      0|				break;
 1331|       |
 1332|      0|			default:
  ------------------
  |  Branch (1332:4): [True: 0, False: 0]
  ------------------
 1333|      0|				break;
 1334|      0|			}
 1335|      0|		} while (!(sub_token == VIPS_TOKEN_RIGHT && depth == 0));
  ------------------
  |  Branch (1335:14): [True: 0, False: 0]
  |  Branch (1335:47): [True: 0, False: 0]
  ------------------
 1336|       |
 1337|      0|		i = VIPS_MIN(q - p, size);
  ------------------
  |  |   55|      0|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1338|      0|		g_strlcpy(string, p, i + 1);
 1339|      0|	}
 1340|       |
 1341|  25.6k|	return q;
 1342|  25.6k|}
vips__find_rightmost_brackets:
 1386|   141k|{
 1387|   141k|	const char *start[MAX_TOKENS + 1];
 1388|   141k|	VipsToken tokens[MAX_TOKENS];
 1389|   141k|	char str[VIPS_PATH_MAX];
 1390|   141k|	int n, i;
 1391|   141k|	int nest;
 1392|       |
 1393|   141k|	start[0] = p;
 1394|   141k|	for (n = 0;
 1395|   283k|		 n < MAX_TOKENS &&
  ------------------
  |  | 1367|   567k|#define MAX_TOKENS (1000)
  ------------------
  |  Branch (1395:4): [True: 283k, False: 0]
  ------------------
 1396|   283k|		 (p = vips__token_get(start[n], &tokens[n],
  ------------------
  |  Branch (1396:4): [True: 141k, False: 141k]
  ------------------
 1397|   283k|			  str, VIPS_PATH_MAX));
  ------------------
  |  |  245|   283k|#define VIPS_PATH_MAX (4096)
  ------------------
 1398|   141k|		 n++, start[n] = p)
 1399|   141k|		;
 1400|       |
 1401|       |	/* Too many tokens?
 1402|       |	 */
 1403|   141k|	if (n >= MAX_TOKENS)
  ------------------
  |  | 1367|   141k|#define MAX_TOKENS (1000)
  ------------------
  |  Branch (1403:6): [True: 0, False: 141k]
  ------------------
 1404|      0|		return NULL;
 1405|       |
 1406|       |	/* No rightmost close bracket?
 1407|       |	 */
 1408|   141k|	if (n == 0 ||
  ------------------
  |  Branch (1408:6): [True: 0, False: 141k]
  ------------------
 1409|   141k|		tokens[n - 1] != VIPS_TOKEN_RIGHT)
  ------------------
  |  Branch (1409:3): [True: 141k, False: 0]
  ------------------
 1410|   141k|		return NULL;
 1411|       |
 1412|      0|	nest = 0;
 1413|      0|	for (i = n - 1; i >= 0; i--) {
  ------------------
  |  Branch (1413:18): [True: 0, False: 0]
  ------------------
 1414|      0|		if (tokens[i] == VIPS_TOKEN_RIGHT)
  ------------------
  |  Branch (1414:7): [True: 0, False: 0]
  ------------------
 1415|      0|			nest += 1;
 1416|      0|		else if (tokens[i] == VIPS_TOKEN_LEFT)
  ------------------
  |  Branch (1416:12): [True: 0, False: 0]
  ------------------
 1417|      0|			nest -= 1;
 1418|       |
 1419|      0|		if (nest == 0)
  ------------------
  |  Branch (1419:7): [True: 0, False: 0]
  ------------------
 1420|      0|			break;
 1421|      0|	}
 1422|       |
 1423|       |	/* No matching left bracket?
 1424|       |	 */
 1425|      0|	if (nest != 0)
  ------------------
  |  Branch (1425:6): [True: 0, False: 0]
  ------------------
 1426|      0|		return NULL;
 1427|       |
 1428|       |	/* This should be the matching left.
 1429|       |	 */
 1430|      0|	return start[i];
 1431|      0|}
vips__filename_split8:
 1439|  21.8k|{
 1440|  21.8k|	char *p;
 1441|       |
 1442|  21.8k|	g_strlcpy(filename, name, VIPS_PATH_MAX);
  ------------------
  |  |  245|  21.8k|#define VIPS_PATH_MAX (4096)
  ------------------
 1443|  21.8k|	if ((p = (char *) vips__find_rightmost_brackets(filename))) {
  ------------------
  |  Branch (1443:6): [True: 0, False: 21.8k]
  ------------------
 1444|      0|		g_strlcpy(option_string, p, VIPS_PATH_MAX);
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 1445|      0|		*p = '\0';
 1446|      0|	}
 1447|  21.8k|	else
 1448|  21.8k|		g_strlcpy(option_string, "", VIPS_PATH_MAX);
  ------------------
  |  |  245|  21.8k|#define VIPS_PATH_MAX (4096)
  ------------------
 1449|  21.8k|}
vips_amiMSBfirst:
 1482|   193k|{
 1483|       |#if G_BYTE_ORDER == G_BIG_ENDIAN
 1484|       |	return 1;
 1485|       |#elif G_BYTE_ORDER == G_LITTLE_ENDIAN
 1486|       |	return 0;
 1487|       |#else
 1488|       |#error "Byte order not recognised"
 1489|       |#endif
 1490|   193k|}
vips_enum_nick:
 1644|  7.07k|{
 1645|  7.07k|	GEnumValue *value;
 1646|       |
 1647|  7.07k|	if (!(value = g_enum_get_value(g_type_class_ref(enm), v)))
  ------------------
  |  Branch (1647:6): [True: 0, False: 7.07k]
  ------------------
 1648|      0|		return "(null)";
 1649|       |
 1650|  7.07k|	return value->value_nick;
 1651|  7.07k|}
util.c:strcspne:
  292|     10|{
  293|     10|	size_t skip;
  294|       |
  295|       |	/* If \ is one of the reject chars, no need for any looping.
  296|       |	 */
  297|     10|	if (strchr(reject, '\\'))
  ------------------
  |  Branch (297:6): [True: 0, False: 10]
  ------------------
  298|      0|		return strcspn(s, reject);
  299|       |
  300|     10|	skip = 0;
  301|     10|	for (;;) {
  302|     10|		skip += strcspn(s + skip, reject);
  303|       |
  304|       |		/* s[skip] is at the start of the string, or the end, or on a
  305|       |		 * break character.
  306|       |		 */
  307|     10|		if (skip == 0 ||
  ------------------
  |  Branch (307:7): [True: 0, False: 10]
  ------------------
  308|     10|			!s[skip] ||
  ------------------
  |  Branch (308:4): [True: 1, False: 9]
  ------------------
  309|     10|			s[skip - 1] != '\\')
  ------------------
  |  Branch (309:4): [True: 9, False: 0]
  ------------------
  310|     10|			break;
  311|       |
  312|       |		/* So skip points at break char and we have a '\' in the char
  313|       |		 * before. Step over the break.
  314|       |		 */
  315|      0|		skip += 1;
  316|      0|	}
  317|       |
  318|     10|	return skip;
  319|     10|}

vips__vector_init:
   75|      2|{
   76|       |#ifdef HAVE_ORC
   77|       |	orc_init();
   78|       |#endif /*HAVE_ORC*/
   79|       |
   80|       |	/* Check whether any features are being disabled by the environment.
   81|       |	 */
   82|      2|	const char *env;
   83|      2|	if ((env = g_getenv("VIPS_VECTOR")))
  ------------------
  |  Branch (83:6): [True: 0, False: 2]
  ------------------
   84|      0|		return vips_vector_disable_targets(
   85|      0|			g_ascii_strtoll(env, NULL, 0));
   86|       |
   87|       |	/* Look for the deprecated IM_NOVECTOR environment variable as well.
   88|       |	 */
   89|      2|	if (g_getenv("VIPS_NOVECTOR")
  ------------------
  |  Branch (89:6): [True: 0, False: 2]
  ------------------
   90|       |#if ENABLE_DEPRECATED
   91|       |		|| g_getenv("IM_NOVECTOR")
   92|       |#endif
   93|      2|	)
   94|      0|		vips__vector_enabled = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
   95|      2|}

countlines.c:vips_countlines_class_init:
  125|      1|{
  126|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  127|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  128|       |
  129|      1|	VIPS_DEBUG_MSG("vips_countlines_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  130|       |
  131|      1|	gobject_class->set_property = vips_object_set_property;
  132|      1|	gobject_class->get_property = vips_object_get_property;
  133|       |
  134|      1|	vobject_class->nickname = "countlines";
  135|      1|	vobject_class->description = _("count lines in an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  136|      1|	vobject_class->build = vips_countlines_build;
  137|       |
  138|      1|	VIPS_ARG_DOUBLE(class, "nolines", 2,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  139|      1|		_("Nolines"),
  140|      1|		_("Number of lines"),
  141|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  142|      1|		G_STRUCT_OFFSET(VipsCountlines, nolines),
  143|      1|		0, 10000000, 0.0);
  144|       |
  145|      1|	VIPS_ARG_ENUM(class, "direction", 3,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  146|      1|		_("Direction"),
  147|      1|		_("Countlines left-right or up-down"),
  148|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  149|      1|		G_STRUCT_OFFSET(VipsCountlines, direction),
  150|      1|		VIPS_TYPE_DIRECTION, VIPS_DIRECTION_HORIZONTAL);
  151|      1|}

labelregions.c:vips_labelregions_class_init:
  112|      1|{
  113|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  114|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  115|       |
  116|      1|	gobject_class->set_property = vips_object_set_property;
  117|      1|	gobject_class->get_property = vips_object_get_property;
  118|       |
  119|      1|	vobject_class->nickname = "labelregions";
  120|      1|	vobject_class->description = _("label regions in an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  121|      1|	vobject_class->build = vips_labelregions_build;
  122|       |
  123|      1|	VIPS_ARG_IMAGE(class, "mask", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  124|      1|		_("Mask"),
  125|      1|		_("Mask of region labels"),
  126|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  127|      1|		G_STRUCT_OFFSET(VipsLabelregions, mask));
  128|       |
  129|      1|	VIPS_ARG_INT(class, "segments", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  130|      1|		_("Segments"),
  131|      1|		_("Number of discrete contiguous regions"),
  132|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  133|      1|		G_STRUCT_OFFSET(VipsLabelregions, segments),
  134|      1|		0, 1000000000, 0);
  135|      1|}

morph.c:vips_morph_class_init:
  932|      1|{
  933|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  934|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  935|       |
  936|      1|	gobject_class->set_property = vips_object_set_property;
  937|      1|	gobject_class->get_property = vips_object_get_property;
  938|       |
  939|       |#ifdef HAVE_ORC
  940|       |	gobject_class->finalize = vips_morph_finalize;
  941|       |#endif /*HAVE_ORC*/
  942|       |
  943|      1|	object_class->nickname = "morph";
  944|      1|	object_class->description = _("morphology operation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  945|      1|	object_class->build = vips_morph_build;
  946|       |
  947|      1|	VIPS_ARG_IMAGE(class, "out", 10,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  948|      1|		_("Output"),
  949|      1|		_("Output image"),
  950|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  951|      1|		G_STRUCT_OFFSET(VipsMorph, out));
  952|       |
  953|      1|	VIPS_ARG_IMAGE(class, "mask", 20,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  954|      1|		_("Mask"),
  955|      1|		_("Input matrix image"),
  956|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  957|      1|		G_STRUCT_OFFSET(VipsMorph, mask));
  958|       |
  959|      1|	VIPS_ARG_ENUM(class, "morph", 103,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  960|      1|		_("Morphology"),
  961|      1|		_("Morphological operation to perform"),
  962|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  963|      1|		G_STRUCT_OFFSET(VipsMorph, morph),
  964|      1|		VIPS_TYPE_OPERATION_MORPHOLOGY,
  965|      1|		VIPS_OPERATION_MORPHOLOGY_ERODE);
  966|      1|}

vips_morphology_operation_init:
  137|      2|{
  138|      2|	extern GType vips_morph_get_type(void);
  139|      2|	extern GType vips_rank_get_type(void);
  140|      2|	extern GType vips_countlines_get_type(void);
  141|      2|	extern GType vips_labelregions_get_type(void);
  142|      2|	extern GType vips_fill_nearest_get_type(void);
  143|       |
  144|      2|	vips_morph_get_type();
  145|      2|	vips_rank_get_type();
  146|      2|	vips_countlines_get_type();
  147|      2|	vips_labelregions_get_type();
  148|      2|	vips_fill_nearest_get_type();
  149|      2|}
morphology.c:vips_morphology_class_init:
  107|      1|{
  108|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  109|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  110|       |
  111|      1|	gobject_class->set_property = vips_object_set_property;
  112|      1|	gobject_class->get_property = vips_object_get_property;
  113|       |
  114|      1|	vobject_class->nickname = "morphology";
  115|      1|	vobject_class->description = _("morphological operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  116|       |
  117|       |	/* Inputs set by subclassess.
  118|       |	 */
  119|       |
  120|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  121|      1|		_("Input"),
  122|      1|		_("Input image argument"),
  123|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  124|      1|		G_STRUCT_OFFSET(VipsMorphology, in));
  125|      1|}

nearest.c:vips_fill_nearest_class_init:
  295|      1|{
  296|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  297|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  298|       |
  299|      1|	gobject_class->finalize = vips_fill_nearest_finalize;
  300|      1|	gobject_class->set_property = vips_object_set_property;
  301|      1|	gobject_class->get_property = vips_object_get_property;
  302|       |
  303|      1|	vobject_class->nickname = "fill_nearest";
  304|      1|	vobject_class->description =
  305|      1|		_("fill image zeros with nearest non-zero pixel");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  306|      1|	vobject_class->build = vips_fill_nearest_build;
  307|       |
  308|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  309|      1|		_("Out"),
  310|      1|		_("Value of nearest non-zero pixel"),
  311|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  312|      1|		G_STRUCT_OFFSET(VipsFillNearest, out));
  313|       |
  314|      1|	VIPS_ARG_IMAGE(class, "distance", 3,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  315|      1|		_("Distance"),
  316|      1|		_("Distance to nearest non-zero pixel"),
  317|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  318|      1|		G_STRUCT_OFFSET(VipsFillNearest, distance));
  319|      1|}

rank.c:vips_rank_class_init:
  552|      1|{
  553|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  554|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  555|       |
  556|      1|	gobject_class->set_property = vips_object_set_property;
  557|      1|	gobject_class->get_property = vips_object_get_property;
  558|       |
  559|      1|	object_class->nickname = "rank";
  560|      1|	object_class->description = _("rank filter");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  561|      1|	object_class->build = vips_rank_build;
  562|       |
  563|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  564|      1|		_("Output"),
  565|      1|		_("Output image"),
  566|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  567|      1|		G_STRUCT_OFFSET(VipsRank, out));
  568|       |
  569|      1|	VIPS_ARG_INT(class, "width", 4,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  570|      1|		_("Width"),
  571|      1|		_("Window width in pixels"),
  572|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  573|      1|		G_STRUCT_OFFSET(VipsRank, width),
  574|      1|		1, 100000, 11);
  575|       |
  576|      1|	VIPS_ARG_INT(class, "height", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  577|      1|		_("Height"),
  578|      1|		_("Window height in pixels"),
  579|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  580|      1|		G_STRUCT_OFFSET(VipsRank, height),
  581|      1|		1, 100000, 11);
  582|       |
  583|      1|	VIPS_ARG_INT(class, "index", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  584|      1|		_("Index"),
  585|      1|		_("Select pixel at index"),
  586|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  587|      1|		G_STRUCT_OFFSET(VipsRank, index),
  588|      1|		0, 100000000, 50);
  589|      1|}

global_balance.c:vips_globalbalance_class_init:
 1912|      1|{
 1913|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1914|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
 1915|       |
 1916|      1|	gobject_class->set_property = vips_object_set_property;
 1917|      1|	gobject_class->get_property = vips_object_get_property;
 1918|       |
 1919|      1|	object_class->nickname = "globalbalance";
 1920|      1|	object_class->description = _("global balance an image mosaic");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1921|      1|	object_class->build = vips_globalbalance_build;
 1922|       |
 1923|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
 1924|      1|		_("Input"),
 1925|      1|		_("Input image"),
 1926|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1927|      1|		G_STRUCT_OFFSET(VipsGlobalbalance, in));
 1928|       |
 1929|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
 1930|      1|		_("Output"),
 1931|      1|		_("Output image"),
 1932|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
 1933|      1|		G_STRUCT_OFFSET(VipsGlobalbalance, out));
 1934|       |
 1935|      1|	VIPS_ARG_DOUBLE(class, "gamma", 5,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
 1936|      1|		_("Gamma"),
 1937|      1|		_("Image gamma"),
 1938|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1939|      1|		G_STRUCT_OFFSET(VipsGlobalbalance, gamma),
 1940|      1|		0.00001, 10, 1.6);
 1941|       |
 1942|      1|	VIPS_ARG_BOOL(class, "int_output", 7,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1943|      1|		_("Int output"),
 1944|      1|		_("Integer output"),
 1945|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1946|      1|		G_STRUCT_OFFSET(VipsGlobalbalance, int_output),
 1947|      1|		FALSE);
 1948|      1|}

match.c:vips_match_class_init:
  184|      1|{
  185|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  186|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  187|       |
  188|      1|	gobject_class->set_property = vips_object_set_property;
  189|      1|	gobject_class->get_property = vips_object_get_property;
  190|       |
  191|      1|	object_class->nickname = "match";
  192|      1|	object_class->description = _("first-order match of two images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  193|      1|	object_class->build = vips_match_build;
  194|       |
  195|      1|	VIPS_ARG_IMAGE(class, "ref", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  196|      1|		_("Reference"),
  197|      1|		_("Reference image"),
  198|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  199|      1|		G_STRUCT_OFFSET(VipsMatch, ref));
  200|       |
  201|      1|	VIPS_ARG_IMAGE(class, "sec", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  202|      1|		_("Secondary"),
  203|      1|		_("Secondary image"),
  204|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  205|      1|		G_STRUCT_OFFSET(VipsMatch, sec));
  206|       |
  207|      1|	VIPS_ARG_IMAGE(class, "out", 3,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  208|      1|		_("Output"),
  209|      1|		_("Output image"),
  210|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  211|      1|		G_STRUCT_OFFSET(VipsMatch, out));
  212|       |
  213|      1|	VIPS_ARG_INT(class, "xr1", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  214|      1|		_("xr1"),
  215|      1|		_("Position of first reference tie-point"),
  216|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  217|      1|		G_STRUCT_OFFSET(VipsMatch, xr1),
  218|      1|		-1000000000, 1000000000, 1);
  219|       |
  220|      1|	VIPS_ARG_INT(class, "yr1", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  221|      1|		_("yr1"),
  222|      1|		_("Position of first reference tie-point"),
  223|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  224|      1|		G_STRUCT_OFFSET(VipsMatch, yr1),
  225|      1|		-1000000000, 1000000000, 1);
  226|       |
  227|      1|	VIPS_ARG_INT(class, "xs1", 7,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  228|      1|		_("xs1"),
  229|      1|		_("Position of first secondary tie-point"),
  230|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  231|      1|		G_STRUCT_OFFSET(VipsMatch, xs1),
  232|      1|		-1000000000, 1000000000, 1);
  233|       |
  234|      1|	VIPS_ARG_INT(class, "ys1", 8,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  235|      1|		_("ys1"),
  236|      1|		_("Position of first secondary tie-point"),
  237|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  238|      1|		G_STRUCT_OFFSET(VipsMatch, ys1),
  239|      1|		-1000000000, 1000000000, 1);
  240|       |
  241|      1|	VIPS_ARG_INT(class, "xr2", 9,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  242|      1|		_("xr2"),
  243|      1|		_("Position of second reference tie-point"),
  244|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  245|      1|		G_STRUCT_OFFSET(VipsMatch, xr2),
  246|      1|		-1000000000, 1000000000, 1);
  247|       |
  248|      1|	VIPS_ARG_INT(class, "yr2", 10,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  249|      1|		_("yr2"),
  250|      1|		_("Position of second reference tie-point"),
  251|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  252|      1|		G_STRUCT_OFFSET(VipsMatch, yr2),
  253|      1|		-1000000000, 1000000000, 1);
  254|       |
  255|      1|	VIPS_ARG_INT(class, "xs2", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  256|      1|		_("xs2"),
  257|      1|		_("Position of second secondary tie-point"),
  258|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  259|      1|		G_STRUCT_OFFSET(VipsMatch, xs2),
  260|      1|		-1000000000, 1000000000, 1);
  261|       |
  262|      1|	VIPS_ARG_INT(class, "ys2", 12,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  263|      1|		_("ys2"),
  264|      1|		_("Position of second secondary tie-point"),
  265|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  266|      1|		G_STRUCT_OFFSET(VipsMatch, ys2),
  267|      1|		-1000000000, 1000000000, 1);
  268|       |
  269|      1|	VIPS_ARG_INT(class, "hwindow", 13,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  270|      1|		_("hwindow"),
  271|      1|		_("Half window size"),
  272|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  273|      1|		G_STRUCT_OFFSET(VipsMatch, hwindow),
  274|      1|		0, 1000000000, 5);
  275|       |
  276|      1|	VIPS_ARG_INT(class, "harea", 14,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  277|      1|		_("harea"),
  278|      1|		_("Half area size"),
  279|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  280|      1|		G_STRUCT_OFFSET(VipsMatch, harea),
  281|      1|		0, 1000000000, 15);
  282|       |
  283|      1|	VIPS_ARG_BOOL(class, "search", 15,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  284|      1|		_("Search"),
  285|      1|		_("Search to improve tie-points"),
  286|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  287|      1|		G_STRUCT_OFFSET(VipsMatch, search),
  288|      1|		FALSE);
  289|       |
  290|      1|	VIPS_ARG_INTERPOLATE(class, "interpolate", 16,
  ------------------
  |  |  138|      1|	VIPS_ARG_OBJECT(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET, VIPS_TYPE_INTERPOLATE)
  |  |  ------------------
  |  |  |  |  125|      1|	{ \
  |  |  |  |  126|      1|		GParamSpec *pspec; \
  |  |  |  |  127|      1|\
  |  |  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  |  |  129|      1|			TYPE, \
  |  |  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  |  |  135|      1|	}
  |  |  ------------------
  ------------------
  291|      1|		_("Interpolate"),
  292|      1|		_("Interpolate pixels with this"),
  293|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  294|      1|		G_STRUCT_OFFSET(VipsMatch, interpolate));
  295|      1|}

matrixinvert.c:vips_matrixinvert_class_init:
  430|      1|{
  431|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  432|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  433|       |
  434|      1|	gobject_class->dispose = vips_matrixinvert_dispose;
  435|      1|	gobject_class->set_property = vips_object_set_property;
  436|      1|	gobject_class->get_property = vips_object_get_property;
  437|       |
  438|      1|	vobject_class->nickname = "matrixinvert";
  439|      1|	vobject_class->description = _("invert an matrix");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  440|      1|	vobject_class->build = vips_matrixinvert_build;
  441|       |
  442|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  443|      1|		_("Input"),
  444|      1|		_("An square matrix"),
  445|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  446|      1|		G_STRUCT_OFFSET(VipsMatrixinvert, in));
  447|       |
  448|      1|	VIPS_ARG_IMAGE(class, "out", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  449|      1|		_("Output"),
  450|      1|		_("Output matrix"),
  451|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  452|      1|		G_STRUCT_OFFSET(VipsMatrixinvert, out));
  453|      1|}

merge.c:vips_merge_class_init:
  107|      1|{
  108|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  109|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  110|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  111|       |
  112|      1|	gobject_class->set_property = vips_object_set_property;
  113|      1|	gobject_class->get_property = vips_object_get_property;
  114|       |
  115|      1|	object_class->nickname = "merge";
  116|      1|	object_class->description = _("merge two images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  117|      1|	object_class->build = vips_merge_build;
  118|       |
  119|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  120|       |
  121|      1|	VIPS_ARG_IMAGE(class, "ref", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  122|      1|		_("Reference"),
  123|      1|		_("Reference image"),
  124|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  125|      1|		G_STRUCT_OFFSET(VipsMerge, ref));
  126|       |
  127|      1|	VIPS_ARG_IMAGE(class, "sec", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  128|      1|		_("Secondary"),
  129|      1|		_("Secondary image"),
  130|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  131|      1|		G_STRUCT_OFFSET(VipsMerge, sec));
  132|       |
  133|      1|	VIPS_ARG_IMAGE(class, "out", 3,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  134|      1|		_("Output"),
  135|      1|		_("Output image"),
  136|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  137|      1|		G_STRUCT_OFFSET(VipsMerge, out));
  138|       |
  139|      1|	VIPS_ARG_ENUM(class, "direction", 4,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  140|      1|		_("Direction"),
  141|      1|		_("Horizontal or vertical merge"),
  142|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  143|      1|		G_STRUCT_OFFSET(VipsMerge, direction),
  144|      1|		VIPS_TYPE_DIRECTION, VIPS_DIRECTION_HORIZONTAL);
  145|       |
  146|      1|	VIPS_ARG_INT(class, "dx", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  147|      1|		_("dx"),
  148|      1|		_("Horizontal displacement from sec to ref"),
  149|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  150|      1|		G_STRUCT_OFFSET(VipsMerge, dx),
  151|      1|		-100000000, 1000000000, 1);
  152|       |
  153|      1|	VIPS_ARG_INT(class, "dy", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  154|      1|		_("dy"),
  155|      1|		_("Vertical displacement from sec to ref"),
  156|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  157|      1|		G_STRUCT_OFFSET(VipsMerge, dy),
  158|      1|		-100000000, 1000000000, 1);
  159|       |
  160|      1|	VIPS_ARG_INT(class, "mblend", 7,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  161|      1|		_("Max blend"),
  162|      1|		_("Maximum blend size"),
  163|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  164|      1|		G_STRUCT_OFFSET(VipsMerge, mblend),
  165|      1|		0, 10000, 10);
  166|      1|}

mosaic.c:vips_mosaic_class_init:
  167|      1|{
  168|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  169|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  170|       |
  171|      1|	gobject_class->set_property = vips_object_set_property;
  172|      1|	gobject_class->get_property = vips_object_get_property;
  173|       |
  174|      1|	object_class->nickname = "mosaic";
  175|      1|	object_class->description = _("mosaic two images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  176|      1|	object_class->build = vips_mosaic_build;
  177|       |
  178|      1|	VIPS_ARG_IMAGE(class, "ref", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  179|      1|		_("Reference"),
  180|      1|		_("Reference image"),
  181|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  182|      1|		G_STRUCT_OFFSET(VipsMosaic, ref));
  183|       |
  184|      1|	VIPS_ARG_IMAGE(class, "sec", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  185|      1|		_("Secondary"),
  186|      1|		_("Secondary image"),
  187|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  188|      1|		G_STRUCT_OFFSET(VipsMosaic, sec));
  189|       |
  190|      1|	VIPS_ARG_IMAGE(class, "out", 3,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  191|      1|		_("Output"),
  192|      1|		_("Output image"),
  193|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  194|      1|		G_STRUCT_OFFSET(VipsMosaic, out));
  195|       |
  196|      1|	VIPS_ARG_ENUM(class, "direction", 4,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  197|      1|		_("Direction"),
  198|      1|		_("Horizontal or vertical mosaic"),
  199|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  200|      1|		G_STRUCT_OFFSET(VipsMosaic, direction),
  201|      1|		VIPS_TYPE_DIRECTION, VIPS_DIRECTION_HORIZONTAL);
  202|       |
  203|      1|	VIPS_ARG_INT(class, "xref", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  204|      1|		_("xref"),
  205|      1|		_("Position of reference tie-point"),
  206|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  207|      1|		G_STRUCT_OFFSET(VipsMosaic, xref),
  208|      1|		0, 1000000000, 1);
  209|       |
  210|      1|	VIPS_ARG_INT(class, "yref", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  211|      1|		_("yref"),
  212|      1|		_("Position of reference tie-point"),
  213|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  214|      1|		G_STRUCT_OFFSET(VipsMosaic, yref),
  215|      1|		0, 1000000000, 1);
  216|       |
  217|      1|	VIPS_ARG_INT(class, "xsec", 7,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  218|      1|		_("xsec"),
  219|      1|		_("Position of secondary tie-point"),
  220|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  221|      1|		G_STRUCT_OFFSET(VipsMosaic, xsec),
  222|      1|		0, 1000000000, 1);
  223|       |
  224|      1|	VIPS_ARG_INT(class, "ysec", 8,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  225|      1|		_("ysec"),
  226|      1|		_("Position of secondary tie-point"),
  227|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  228|      1|		G_STRUCT_OFFSET(VipsMosaic, ysec),
  229|      1|		0, 1000000000, 1);
  230|       |
  231|      1|	VIPS_ARG_INT(class, "hwindow", 9,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  232|      1|		_("hwindow"),
  233|      1|		_("Half window size"),
  234|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  235|      1|		G_STRUCT_OFFSET(VipsMosaic, hwindow),
  236|      1|		0, 1000000000, 5);
  237|       |
  238|      1|	VIPS_ARG_INT(class, "harea", 10,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  239|      1|		_("harea"),
  240|      1|		_("Half area size"),
  241|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  242|      1|		G_STRUCT_OFFSET(VipsMosaic, harea),
  243|      1|		0, 1000000000, 15);
  244|       |
  245|      1|	VIPS_ARG_INT(class, "mblend", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  246|      1|		_("Max blend"),
  247|      1|		_("Maximum blend size"),
  248|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  249|      1|		G_STRUCT_OFFSET(VipsMosaic, mblend),
  250|      1|		0, 10000, 10);
  251|       |
  252|      1|	VIPS_ARG_INT(class, "bandno", 12,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  253|      1|		_("Search band"),
  254|      1|		_("Band to search for features on"),
  255|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  256|      1|		G_STRUCT_OFFSET(VipsMosaic, bandno),
  257|      1|		0, 10000, 0);
  258|       |
  259|      1|	VIPS_ARG_INT(class, "dx0", 13,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  260|      1|		_("Integer offset"),
  261|      1|		_("Detected integer offset"),
  262|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  263|      1|		G_STRUCT_OFFSET(VipsMosaic, dx0),
  264|      1|		-10000000, 10000000, 0);
  265|       |
  266|      1|	VIPS_ARG_INT(class, "dy0", 14,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  267|      1|		_("Integer offset"),
  268|      1|		_("Detected integer offset"),
  269|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  270|      1|		G_STRUCT_OFFSET(VipsMosaic, dy0),
  271|      1|		-10000000, 10000000, 0);
  272|       |
  273|      1|	VIPS_ARG_DOUBLE(class, "scale1", 15,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  274|      1|		_("Scale"),
  275|      1|		_("Detected scale"),
  276|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  277|      1|		G_STRUCT_OFFSET(VipsMosaic, scale1),
  278|      1|		-10000000.0, 10000000.0, 1.0);
  279|       |
  280|      1|	VIPS_ARG_DOUBLE(class, "angle1", 16,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  281|      1|		_("Angle"),
  282|      1|		_("Detected rotation"),
  283|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  284|      1|		G_STRUCT_OFFSET(VipsMosaic, angle1),
  285|      1|		-10000000.0, 10000000.0, 0.0);
  286|       |
  287|      1|	VIPS_ARG_DOUBLE(class, "dx1", 17,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  288|      1|		_("First-order displacement"),
  289|      1|		_("Detected first-order displacement"),
  290|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  291|      1|		G_STRUCT_OFFSET(VipsMosaic, dx1),
  292|      1|		-10000000.0, 10000000.0, 0.0);
  293|       |
  294|      1|	VIPS_ARG_DOUBLE(class, "dy1", 17,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  295|      1|		_("First-order displacement"),
  296|      1|		_("Detected first-order displacement"),
  297|      1|		VIPS_ARGUMENT_OPTIONAL_OUTPUT,
  298|      1|		G_STRUCT_OFFSET(VipsMosaic, dy1),
  299|      1|		-10000000.0, 10000000.0, 0.0);
  300|      1|}

mosaic1.c:vips_mosaic1_class_init:
  486|      1|{
  487|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  488|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  489|       |
  490|      1|	gobject_class->set_property = vips_object_set_property;
  491|      1|	gobject_class->get_property = vips_object_get_property;
  492|       |
  493|      1|	object_class->nickname = "mosaic1";
  494|      1|	object_class->description = _("first-order mosaic of two images");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  495|      1|	object_class->build = vips_mosaic1_build;
  496|       |
  497|      1|	VIPS_ARG_IMAGE(class, "ref", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  498|      1|		_("Reference"),
  499|      1|		_("Reference image"),
  500|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  501|      1|		G_STRUCT_OFFSET(VipsMosaic1, ref));
  502|       |
  503|      1|	VIPS_ARG_IMAGE(class, "sec", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  504|      1|		_("Secondary"),
  505|      1|		_("Secondary image"),
  506|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  507|      1|		G_STRUCT_OFFSET(VipsMosaic1, sec));
  508|       |
  509|      1|	VIPS_ARG_IMAGE(class, "out", 3,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  510|      1|		_("Output"),
  511|      1|		_("Output image"),
  512|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  513|      1|		G_STRUCT_OFFSET(VipsMosaic1, out));
  514|       |
  515|      1|	VIPS_ARG_ENUM(class, "direction", 4,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  516|      1|		_("Direction"),
  517|      1|		_("Horizontal or vertical mosaic"),
  518|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  519|      1|		G_STRUCT_OFFSET(VipsMosaic1, direction),
  520|      1|		VIPS_TYPE_DIRECTION, VIPS_DIRECTION_HORIZONTAL);
  521|       |
  522|      1|	VIPS_ARG_INT(class, "xr1", 5,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  523|      1|		_("xr1"),
  524|      1|		_("Position of first reference tie-point"),
  525|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  526|      1|		G_STRUCT_OFFSET(VipsMosaic1, xr1),
  527|      1|		-1000000000, 1000000000, 1);
  528|       |
  529|      1|	VIPS_ARG_INT(class, "yr1", 6,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  530|      1|		_("yr1"),
  531|      1|		_("Position of first reference tie-point"),
  532|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  533|      1|		G_STRUCT_OFFSET(VipsMosaic1, yr1),
  534|      1|		-1000000000, 1000000000, 1);
  535|       |
  536|      1|	VIPS_ARG_INT(class, "xs1", 7,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  537|      1|		_("xs1"),
  538|      1|		_("Position of first secondary tie-point"),
  539|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  540|      1|		G_STRUCT_OFFSET(VipsMosaic1, xs1),
  541|      1|		-1000000000, 1000000000, 1);
  542|       |
  543|      1|	VIPS_ARG_INT(class, "ys1", 8,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  544|      1|		_("ys1"),
  545|      1|		_("Position of first secondary tie-point"),
  546|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  547|      1|		G_STRUCT_OFFSET(VipsMosaic1, ys1),
  548|      1|		-1000000000, 1000000000, 1);
  549|       |
  550|      1|	VIPS_ARG_INT(class, "xr2", 9,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  551|      1|		_("xr2"),
  552|      1|		_("Position of second reference tie-point"),
  553|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  554|      1|		G_STRUCT_OFFSET(VipsMosaic1, xr2),
  555|      1|		-1000000000, 1000000000, 1);
  556|       |
  557|      1|	VIPS_ARG_INT(class, "yr2", 10,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  558|      1|		_("yr2"),
  559|      1|		_("Position of second reference tie-point"),
  560|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  561|      1|		G_STRUCT_OFFSET(VipsMosaic1, yr2),
  562|      1|		-1000000000, 1000000000, 1);
  563|       |
  564|      1|	VIPS_ARG_INT(class, "xs2", 11,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  565|      1|		_("xs2"),
  566|      1|		_("Position of second secondary tie-point"),
  567|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  568|      1|		G_STRUCT_OFFSET(VipsMosaic1, xs2),
  569|      1|		-1000000000, 1000000000, 1);
  570|       |
  571|      1|	VIPS_ARG_INT(class, "ys2", 12,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  572|      1|		_("ys2"),
  573|      1|		_("Position of second secondary tie-point"),
  574|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  575|      1|		G_STRUCT_OFFSET(VipsMosaic1, ys2),
  576|      1|		-1000000000, 1000000000, 1);
  577|       |
  578|      1|	VIPS_ARG_INT(class, "hwindow", 13,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  579|      1|		_("hwindow"),
  580|      1|		_("Half window size"),
  581|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  582|      1|		G_STRUCT_OFFSET(VipsMosaic1, hwindow),
  583|      1|		0, 1000000000, 5);
  584|       |
  585|      1|	VIPS_ARG_INT(class, "harea", 14,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  586|      1|		_("harea"),
  587|      1|		_("Half area size"),
  588|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  589|      1|		G_STRUCT_OFFSET(VipsMosaic1, harea),
  590|      1|		0, 1000000000, 15);
  591|       |
  592|      1|	VIPS_ARG_BOOL(class, "search", 15,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  593|      1|		_("Search"),
  594|      1|		_("Search to improve tie-points"),
  595|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  596|      1|		G_STRUCT_OFFSET(VipsMosaic1, search),
  597|      1|		FALSE);
  598|       |
  599|      1|	VIPS_ARG_INTERPOLATE(class, "interpolate", 16,
  ------------------
  |  |  138|      1|	VIPS_ARG_OBJECT(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET, VIPS_TYPE_INTERPOLATE)
  |  |  ------------------
  |  |  |  |  125|      1|	{ \
  |  |  |  |  126|      1|		GParamSpec *pspec; \
  |  |  |  |  127|      1|\
  |  |  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  |  |  129|      1|			TYPE, \
  |  |  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  |  |  135|      1|	}
  |  |  ------------------
  ------------------
  600|      1|		_("Interpolate"),
  601|      1|		_("Interpolate pixels with this"),
  602|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  603|      1|		G_STRUCT_OFFSET(VipsMosaic1, interpolate));
  604|       |
  605|      1|	VIPS_ARG_INT(class, "mblend", 17,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  606|      1|		_("Max blend"),
  607|      1|		_("Maximum blend size"),
  608|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  609|      1|		G_STRUCT_OFFSET(VipsMosaic1, mblend),
  610|      1|		0, 10000, 10);
  611|       |
  612|      1|	VIPS_ARG_INT(class, "bandno", 18,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  613|      1|		_("Search band"),
  614|      1|		_("Band to search for features on"),
  615|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  616|      1|		G_STRUCT_OFFSET(VipsMosaic1, bandno),
  617|      1|		0, 10000, 0);
  618|      1|}

vips_mosaicing_operation_init:
   93|      2|{
   94|      2|	extern GType vips_merge_get_type(void);
   95|      2|	extern GType vips_mosaic_get_type(void);
   96|      2|	extern GType vips_mosaic1_get_type(void);
   97|      2|	extern GType vips_match_get_type(void);
   98|      2|	extern GType vips_globalbalance_get_type(void);
   99|      2|	extern GType vips_matrixinvert_get_type(void);
  100|       |
  101|      2|	vips_merge_get_type();
  102|      2|	vips_mosaic_get_type();
  103|      2|	vips_mosaic1_get_type();
  104|      2|	vips_matrixinvert_get_type();
  105|      2|	vips_match_get_type();
  106|      2|	vips_globalbalance_get_type();
  107|      2|}

affine.c:vips_affine_class_init:
  629|      1|{
  630|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  631|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  632|       |
  633|      1|	VIPS_DEBUG_MSG("vips_affine_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  634|       |
  635|      1|	gobject_class->dispose = vips_affine_dispose;
  636|      1|	gobject_class->set_property = vips_object_set_property;
  637|      1|	gobject_class->get_property = vips_object_get_property;
  638|       |
  639|      1|	vobject_class->nickname = "affine";
  640|      1|	vobject_class->description = _("affine transform of an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  641|      1|	vobject_class->build = vips_affine_build;
  642|       |
  643|      1|	VIPS_ARG_BOXED(class, "matrix", 110,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  644|      1|		_("Matrix"),
  645|      1|		_("Transformation matrix"),
  646|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  647|      1|		G_STRUCT_OFFSET(VipsAffine, matrix),
  648|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  649|       |
  650|      1|	VIPS_ARG_INTERPOLATE(class, "interpolate", 2,
  ------------------
  |  |  138|      1|	VIPS_ARG_OBJECT(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET, VIPS_TYPE_INTERPOLATE)
  |  |  ------------------
  |  |  |  |  125|      1|	{ \
  |  |  |  |  126|      1|		GParamSpec *pspec; \
  |  |  |  |  127|      1|\
  |  |  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  |  |  129|      1|			TYPE, \
  |  |  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  |  |  135|      1|	}
  |  |  ------------------
  ------------------
  651|      1|		_("Interpolate"),
  652|      1|		_("Interpolate pixels with this"),
  653|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  654|      1|		G_STRUCT_OFFSET(VipsAffine, interpolate));
  655|       |
  656|      1|	VIPS_ARG_BOXED(class, "oarea", 111,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  657|      1|		_("Output rect"),
  658|      1|		_("Area of output to generate"),
  659|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  660|      1|		G_STRUCT_OFFSET(VipsAffine, oarea),
  661|      1|		VIPS_TYPE_ARRAY_INT);
  662|       |
  663|      1|	VIPS_ARG_DOUBLE(class, "odx", 112,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  664|      1|		_("Output offset"),
  665|      1|		_("Horizontal output displacement"),
  666|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  667|      1|		G_STRUCT_OFFSET(VipsAffine, odx),
  668|      1|		-10000000, 10000000, 0);
  669|       |
  670|      1|	VIPS_ARG_DOUBLE(class, "ody", 113,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  671|      1|		_("Output offset"),
  672|      1|		_("Vertical output displacement"),
  673|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  674|      1|		G_STRUCT_OFFSET(VipsAffine, ody),
  675|      1|		-10000000, 10000000, 0);
  676|       |
  677|      1|	VIPS_ARG_DOUBLE(class, "idx", 114,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  678|      1|		_("Input offset"),
  679|      1|		_("Horizontal input displacement"),
  680|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  681|      1|		G_STRUCT_OFFSET(VipsAffine, idx),
  682|      1|		-10000000, 10000000, 0);
  683|       |
  684|      1|	VIPS_ARG_DOUBLE(class, "idy", 115,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  685|      1|		_("Input offset"),
  686|      1|		_("Vertical input displacement"),
  687|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  688|      1|		G_STRUCT_OFFSET(VipsAffine, idy),
  689|      1|		-10000000, 10000000, 0);
  690|       |
  691|      1|	VIPS_ARG_ENUM(class, "extend", 117,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  692|      1|		_("Extend"),
  693|      1|		_("How to generate the extra pixels"),
  694|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  695|      1|		G_STRUCT_OFFSET(VipsAffine, extend),
  696|      1|		VIPS_TYPE_EXTEND, VIPS_EXTEND_BACKGROUND);
  697|       |
  698|      1|	VIPS_ARG_BOXED(class, "background", 116,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  699|      1|		_("Background"),
  700|      1|		_("Background value"),
  701|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  702|      1|		G_STRUCT_OFFSET(VipsAffine, background),
  703|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  704|       |
  705|      1|	VIPS_ARG_BOOL(class, "premultiplied", 117,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  706|      1|		_("Premultiplied"),
  707|      1|		_("Images have premultiplied alpha"),
  708|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  709|      1|		G_STRUCT_OFFSET(VipsAffine, premultiplied),
  710|      1|		FALSE);
  711|      1|}

bicubic.cpp:_ZL35vips_interpolate_bicubic_class_initP21_VipsInterpolateClass:
  623|      1|{
  624|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(iclass);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  625|      1|	VipsInterpolateClass *interpolate_class =
  626|      1|		VIPS_INTERPOLATE_CLASS(iclass);
  ------------------
  |  |   50|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      1|		VIPS_TYPE_INTERPOLATE, VipsInterpolateClass))
  ------------------
  627|       |
  628|      1|	object_class->nickname = "bicubic";
  629|      1|	object_class->description = _("bicubic interpolation (Catmull-Rom)");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  630|       |
  631|      1|	interpolate_class->interpolate = vips_interpolate_bicubic_interpolate;
  632|      1|	interpolate_class->window_size = 4;
  633|       |
  634|       |	/* Build the tables of pre-computed coefficients.
  635|       |	 */
  636|     66|	for (int x = 0; x < VIPS_TRANSFORM_SCALE + 1; x++) {
  ------------------
  |  |  112|     66|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|     66|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  |  Branch (636:18): [True: 65, False: 1]
  ------------------
  637|     65|		calculate_coefficients_catmull(vips_bicubic_matrixf[x],
  638|     65|			(float) x / VIPS_TRANSFORM_SCALE);
  ------------------
  |  |  112|     65|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|     65|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  639|       |
  640|    325|		for (int i = 0; i < 4; i++)
  ------------------
  |  Branch (640:19): [True: 260, False: 65]
  ------------------
  641|    260|			vips_bicubic_matrixi[x][i] =
  642|    260|				vips_bicubic_matrixf[x][i] *
  643|    260|				VIPS_INTERPOLATE_SCALE;
  ------------------
  |  |  120|    260|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|    260|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
  644|     65|	}
  645|      1|}

vips__interpolate_init:
  626|      2|{
  627|      2|	extern GType vips_interpolate_bicubic_get_type(void);
  628|      2|	extern GType vips_interpolate_lbb_get_type(void);
  629|      2|	extern GType vips_interpolate_nohalo_get_type(void);
  630|      2|	extern GType vips_interpolate_vsqbs_get_type(void);
  631|       |
  632|      2|	vips_interpolate_nearest_get_type();
  633|      2|	vips_interpolate_bilinear_get_type();
  634|       |
  635|      2|	vips_interpolate_bicubic_get_type();
  636|      2|	vips_interpolate_lbb_get_type();
  637|      2|	vips_interpolate_nohalo_get_type();
  638|      2|	vips_interpolate_vsqbs_get_type();
  639|      2|}
interpolate.c:vips_interpolate_class_init:
  173|      1|{
  174|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  175|       |
  176|       |#ifdef DEBUG
  177|       |	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  178|       |#endif /*DEBUG*/
  179|       |
  180|       |#ifdef DEBUG
  181|       |	gobject_class->finalize = vips_interpolate_finalize;
  182|       |#endif /*DEBUG*/
  183|       |
  184|      1|	vobject_class->nickname = "interpolate";
  185|      1|	vobject_class->description = _("VIPS interpolators");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  186|       |
  187|      1|	class->interpolate = NULL;
  188|      1|	class->get_window_size = vips_interpolate_real_get_window_size;
  189|      1|	class->get_window_offset = vips_interpolate_real_get_window_offset;
  190|      1|	class->window_size = -1;
  191|      1|	class->window_offset = -1;
  192|      1|}
interpolate.c:vips_interpolate_nearest_class_init:
  355|      1|{
  356|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  357|      1|	VipsInterpolateClass *interpolate_class =
  358|      1|		VIPS_INTERPOLATE_CLASS(class);
  ------------------
  |  |   50|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      1|		VIPS_TYPE_INTERPOLATE, VipsInterpolateClass))
  ------------------
  359|       |
  360|      1|	object_class->nickname = "nearest";
  361|      1|	object_class->description = _("nearest-neighbour interpolation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  362|       |
  363|      1|	interpolate_class->interpolate = vips_interpolate_nearest_interpolate;
  364|      1|	interpolate_class->window_size = 1;
  365|      1|}
interpolate.c:vips_interpolate_bilinear_class_init:
  573|      1|{
  574|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  575|      1|	VipsInterpolateClass *interpolate_class =
  576|      1|		(VipsInterpolateClass *) class;
  577|       |
  578|      1|	object_class->nickname = "bilinear";
  579|      1|	object_class->description = _("bilinear interpolation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  580|       |
  581|      1|	interpolate_class->interpolate = vips_interpolate_bilinear_interpolate;
  582|      1|	interpolate_class->window_size = 2;
  583|      1|}

lbb.cpp:_ZL31vips_interpolate_lbb_class_initP24_VipsInterpolateLbbClass:
  866|      1|{
  867|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(klass);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  868|      1|	VipsInterpolateClass *interpolate_class =
  869|      1|		VIPS_INTERPOLATE_CLASS(klass);
  ------------------
  |  |   50|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      1|		VIPS_TYPE_INTERPOLATE, VipsInterpolateClass))
  ------------------
  870|       |
  871|      1|	object_class->nickname = "lbb";
  872|      1|	object_class->description = _("reduced halo bicubic");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  873|       |
  874|      1|	interpolate_class->interpolate = vips_interpolate_lbb_interpolate;
  875|      1|	interpolate_class->window_size = 4;
  876|      1|}

mapim.c:vips_mapim_class_init:
  541|      1|{
  542|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  543|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  544|       |
  545|      1|	VIPS_DEBUG_MSG("vips_mapim_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  546|       |
  547|      1|	gobject_class->set_property = vips_object_set_property;
  548|      1|	gobject_class->get_property = vips_object_get_property;
  549|       |
  550|      1|	vobject_class->nickname = "mapim";
  551|      1|	vobject_class->description = _("resample with a map image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  552|      1|	vobject_class->build = vips_mapim_build;
  553|       |
  554|      1|	VIPS_ARG_IMAGE(class, "index", 3,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  555|      1|		_("Index"),
  556|      1|		_("Index pixels with this"),
  557|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  558|      1|		G_STRUCT_OFFSET(VipsMapim, index));
  559|       |
  560|      1|	VIPS_ARG_INTERPOLATE(class, "interpolate", 4,
  ------------------
  |  |  138|      1|	VIPS_ARG_OBJECT(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET, VIPS_TYPE_INTERPOLATE)
  |  |  ------------------
  |  |  |  |  125|      1|	{ \
  |  |  |  |  126|      1|		GParamSpec *pspec; \
  |  |  |  |  127|      1|\
  |  |  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  |  |  129|      1|			TYPE, \
  |  |  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  |  |  135|      1|	}
  |  |  ------------------
  ------------------
  561|      1|		_("Interpolate"),
  562|      1|		_("Interpolate pixels with this"),
  563|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  564|      1|		G_STRUCT_OFFSET(VipsMapim, interpolate));
  565|       |
  566|      1|	VIPS_ARG_ENUM(class, "extend", 117,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  567|      1|		_("Extend"),
  568|      1|		_("How to generate the extra pixels"),
  569|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  570|      1|		G_STRUCT_OFFSET(VipsMapim, extend),
  571|      1|		VIPS_TYPE_EXTEND, VIPS_EXTEND_BACKGROUND);
  572|       |
  573|      1|	VIPS_ARG_BOXED(class, "background", 116,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  574|      1|		_("Background"),
  575|      1|		_("Background value"),
  576|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  577|      1|		G_STRUCT_OFFSET(VipsMapim, background),
  578|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  579|       |
  580|      1|	VIPS_ARG_BOOL(class, "premultiplied", 117,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  581|      1|		_("Premultiplied"),
  582|      1|		_("Images have premultiplied alpha"),
  583|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  584|      1|		G_STRUCT_OFFSET(VipsMapim, premultiplied),
  585|      1|		FALSE);
  586|      1|}

nohalo.cpp:_ZL34vips_interpolate_nohalo_class_initP27_VipsInterpolateNohaloClass:
 1545|      1|{
 1546|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(klass);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1547|      1|	VipsInterpolateClass *interpolate_class = VIPS_INTERPOLATE_CLASS(klass);
  ------------------
  |  |   50|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      1|		VIPS_TYPE_INTERPOLATE, VipsInterpolateClass))
  ------------------
 1548|       |
 1549|      1|	object_class->nickname = "nohalo";
 1550|      1|	object_class->description =
 1551|      1|		_("edge sharpening resampler with halo reduction");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1552|       |
 1553|      1|	interpolate_class->interpolate = vips_interpolate_nohalo_interpolate;
 1554|      1|	interpolate_class->window_size = 6;
 1555|      1|	interpolate_class->window_offset = 2;
 1556|      1|}

quadratic.c:vips_quadratic_class_init:
  329|      1|{
  330|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  331|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|       |
  333|      1|	VIPS_DEBUG_MSG("vips_quadratic_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  334|       |
  335|      1|	gobject_class->dispose = vips_quadratic_dispose;
  336|      1|	gobject_class->set_property = vips_object_set_property;
  337|      1|	gobject_class->get_property = vips_object_get_property;
  338|       |
  339|      1|	vobject_class->nickname = "quadratic";
  340|      1|	vobject_class->description =
  341|      1|		_("resample an image with a quadratic transform");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  342|      1|	vobject_class->build = vips_quadratic_build;
  343|       |
  344|      1|	VIPS_ARG_IMAGE(class, "coeff", 8,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  345|      1|		_("Coeff"),
  346|      1|		_("Coefficient matrix"),
  347|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  348|      1|		G_STRUCT_OFFSET(VipsQuadratic, coeff));
  349|       |
  350|      1|	VIPS_ARG_INTERPOLATE(class, "interpolate", 9,
  ------------------
  |  |  138|      1|	VIPS_ARG_OBJECT(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET, VIPS_TYPE_INTERPOLATE)
  |  |  ------------------
  |  |  |  |  125|      1|	{ \
  |  |  |  |  126|      1|		GParamSpec *pspec; \
  |  |  |  |  127|      1|\
  |  |  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  |  |  129|      1|			TYPE, \
  |  |  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  |  |  135|      1|	}
  |  |  ------------------
  ------------------
  351|      1|		_("Interpolate"),
  352|      1|		_("Interpolate values with this"),
  353|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  354|      1|		G_STRUCT_OFFSET(VipsQuadratic, interpolate));
  355|      1|}

reduce.c:vips_reduce_class_init:
  188|      1|{
  189|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  190|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  191|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  192|       |
  193|      1|	VIPS_DEBUG_MSG("vips_reduce_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  194|       |
  195|      1|	gobject_class->set_property = vips_object_set_property;
  196|      1|	gobject_class->get_property = vips_object_get_property;
  197|       |
  198|      1|	vobject_class->nickname = "reduce";
  199|      1|	vobject_class->description = _("reduce an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  200|      1|	vobject_class->build = vips_reduce_build;
  201|       |
  202|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  203|       |
  204|      1|	VIPS_ARG_DOUBLE(class, "hshrink", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  205|      1|		_("Hshrink"),
  206|      1|		_("Horizontal shrink factor"),
  207|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  208|      1|		G_STRUCT_OFFSET(VipsReduce, hshrink),
  209|      1|		1.0, 1000000.0, 1.0);
  210|       |
  211|      1|	VIPS_ARG_DOUBLE(class, "vshrink", 9,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  212|      1|		_("Vshrink"),
  213|      1|		_("Vertical shrink factor"),
  214|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  215|      1|		G_STRUCT_OFFSET(VipsReduce, vshrink),
  216|      1|		1.0, 1000000.0, 1.0);
  217|       |
  218|      1|	VIPS_ARG_ENUM(class, "kernel", 3,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  219|      1|		_("Kernel"),
  220|      1|		_("Resampling kernel"),
  221|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  222|      1|		G_STRUCT_OFFSET(VipsReduce, kernel),
  223|      1|		VIPS_TYPE_KERNEL, VIPS_KERNEL_LANCZOS3);
  224|       |
  225|      1|	VIPS_ARG_DOUBLE(class, "gap", 4,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  226|      1|		_("Gap"),
  227|      1|		_("Reducing gap"),
  228|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  229|      1|		G_STRUCT_OFFSET(VipsReduce, gap),
  230|      1|		0.0, 1000000.0, 0.0);
  231|       |
  232|       |	/* The old names .. now use h and v everywhere.
  233|       |	 */
  234|      1|	VIPS_ARG_DOUBLE(class, "xshrink", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  235|      1|		_("Xshrink"),
  236|      1|		_("Horizontal shrink factor"),
  237|      1|		VIPS_ARGUMENT_REQUIRED_INPUT | VIPS_ARGUMENT_DEPRECATED,
  238|      1|		G_STRUCT_OFFSET(VipsReduce, hshrink),
  239|      1|		1.0, 1000000.0, 1.0);
  240|       |
  241|      1|	VIPS_ARG_DOUBLE(class, "yshrink", 9,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  242|      1|		_("Yshrink"),
  243|      1|		_("Vertical shrink factor"),
  244|      1|		VIPS_ARGUMENT_REQUIRED_INPUT | VIPS_ARGUMENT_DEPRECATED,
  245|      1|		G_STRUCT_OFFSET(VipsReduce, vshrink),
  246|      1|		1.0, 1000000.0, 1.0);
  247|       |
  248|       |	/* We used to let people pick centre or corner, but it's automatic now.
  249|       |	 */
  250|      1|	VIPS_ARG_BOOL(class, "centre", 7,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  251|      1|		_("Centre"),
  252|      1|		_("Use centre sampling convention"),
  253|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  254|      1|		G_STRUCT_OFFSET(VipsReduce, centre),
  255|      1|		FALSE);
  256|      1|}

reduceh.cpp:_ZL23vips_reduceh_class_initP18_VipsResampleClass:
  568|      1|{
  569|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(reduceh_class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  570|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(reduceh_class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  571|      1|	VipsOperationClass *operation_class =
  572|      1|		VIPS_OPERATION_CLASS(reduceh_class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  573|       |
  574|      1|	VIPS_DEBUG_MSG("vips_reduceh_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  575|       |
  576|      1|	gobject_class->set_property = vips_object_set_property;
  577|      1|	gobject_class->get_property = vips_object_get_property;
  578|       |
  579|      1|	vobject_class->nickname = "reduceh";
  580|      1|	vobject_class->description = _("shrink an image horizontally");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  581|      1|	vobject_class->build = vips_reduceh_build;
  582|       |
  583|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  584|       |
  585|      1|	VIPS_ARG_DOUBLE(reduceh_class, "hshrink", 3,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  586|      1|		_("Hshrink"),
  587|      1|		_("Horizontal shrink factor"),
  588|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  589|      1|		G_STRUCT_OFFSET(VipsReduceh, hshrink),
  590|      1|		1.0, 1000000.0, 1.0);
  591|       |
  592|      1|	VIPS_ARG_ENUM(reduceh_class, "kernel", 4,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  593|      1|		_("Kernel"),
  594|      1|		_("Resampling kernel"),
  595|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  596|      1|		G_STRUCT_OFFSET(VipsReduceh, kernel),
  597|      1|		VIPS_TYPE_KERNEL, VIPS_KERNEL_LANCZOS3);
  598|       |
  599|      1|	VIPS_ARG_DOUBLE(reduceh_class, "gap", 5,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  600|      1|		_("Gap"),
  601|      1|		_("Reducing gap"),
  602|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  603|      1|		G_STRUCT_OFFSET(VipsReduceh, gap),
  604|      1|		0.0, 1000000.0, 0.0);
  605|       |
  606|       |	/* Old name.
  607|       |	 */
  608|      1|	VIPS_ARG_DOUBLE(reduceh_class, "xshrink", 3,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  609|      1|		_("Xshrink"),
  610|      1|		_("Horizontal shrink factor"),
  611|      1|		VIPS_ARGUMENT_REQUIRED_INPUT | VIPS_ARGUMENT_DEPRECATED,
  612|      1|		G_STRUCT_OFFSET(VipsReduceh, hshrink),
  613|      1|		1.0, 1000000.0, 1.0);
  614|       |
  615|       |	/* We used to let people pick centre or corner, but it's automatic now.
  616|       |	 */
  617|      1|	VIPS_ARG_BOOL(reduceh_class, "centre", 7,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  618|      1|		_("Centre"),
  619|      1|		_("Use centre sampling convention"),
  620|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  621|      1|		G_STRUCT_OFFSET(VipsReduceh, centre),
  622|      1|		FALSE);
  623|      1|}

reducev.cpp:_ZL23vips_reducev_class_initP18_VipsResampleClass:
 1049|      1|{
 1050|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(reducev_class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1051|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(reducev_class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1052|      1|	VipsOperationClass *operation_class =
 1053|      1|		VIPS_OPERATION_CLASS(reducev_class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
 1054|       |
 1055|      1|	VIPS_DEBUG_MSG("vips_reducev_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1056|       |
 1057|       |#ifdef HAVE_ORC
 1058|       |	gobject_class->finalize = vips_reducev_finalize;
 1059|       |#endif /*HAVE_ORC*/
 1060|      1|	gobject_class->set_property = vips_object_set_property;
 1061|      1|	gobject_class->get_property = vips_object_get_property;
 1062|       |
 1063|      1|	vobject_class->nickname = "reducev";
 1064|      1|	vobject_class->description = _("shrink an image vertically");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1065|      1|	vobject_class->build = vips_reducev_build;
 1066|       |
 1067|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
 1068|       |
 1069|      1|	VIPS_ARG_DOUBLE(reducev_class, "vshrink", 3,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
 1070|      1|		_("Vshrink"),
 1071|      1|		_("Vertical shrink factor"),
 1072|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1073|      1|		G_STRUCT_OFFSET(VipsReducev, vshrink),
 1074|      1|		1.0, 1000000.0, 1.0);
 1075|       |
 1076|      1|	VIPS_ARG_ENUM(reducev_class, "kernel", 4,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
 1077|      1|		_("Kernel"),
 1078|      1|		_("Resampling kernel"),
 1079|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1080|      1|		G_STRUCT_OFFSET(VipsReducev, kernel),
 1081|      1|		VIPS_TYPE_KERNEL, VIPS_KERNEL_LANCZOS3);
 1082|       |
 1083|      1|	VIPS_ARG_DOUBLE(reducev_class, "gap", 5,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
 1084|      1|		_("Gap"),
 1085|      1|		_("Reducing gap"),
 1086|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1087|      1|		G_STRUCT_OFFSET(VipsReducev, gap),
 1088|      1|		0.0, 1000000.0, 0.0);
 1089|       |
 1090|       |	/* Old name.
 1091|       |	 */
 1092|      1|	VIPS_ARG_DOUBLE(reducev_class, "yshrink", 3,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
 1093|      1|		_("Yshrink"),
 1094|      1|		_("Vertical shrink factor"),
 1095|      1|		VIPS_ARGUMENT_REQUIRED_INPUT | VIPS_ARGUMENT_DEPRECATED,
 1096|      1|		G_STRUCT_OFFSET(VipsReducev, vshrink),
 1097|      1|		1.0, 1000000.0, 1.0);
 1098|       |
 1099|       |	/* We used to let people pick centre or corner, but it's automatic now.
 1100|       |	 */
 1101|      1|	VIPS_ARG_BOOL(reducev_class, "centre", 7,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1102|      1|		_("Centre"),
 1103|      1|		_("Use centre sampling convention"),
 1104|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
 1105|      1|		G_STRUCT_OFFSET(VipsReducev, centre),
 1106|      1|		FALSE);
 1107|      1|}

vips_resample_operation_init:
  162|      2|{
  163|      2|	extern GType vips_thumbnail_file_get_type(void);
  164|      2|	extern GType vips_thumbnail_buffer_get_type(void);
  165|      2|	extern GType vips_thumbnail_image_get_type(void);
  166|      2|	extern GType vips_thumbnail_source_get_type(void);
  167|      2|	extern GType vips_mapim_get_type(void);
  168|      2|	extern GType vips_shrink_get_type(void);
  169|      2|	extern GType vips_shrinkh_get_type(void);
  170|      2|	extern GType vips_shrinkv_get_type(void);
  171|      2|	extern GType vips_reduce_get_type(void);
  172|      2|	extern GType vips_reduceh_get_type(void);
  173|      2|	extern GType vips_reducev_get_type(void);
  174|      2|	extern GType vips_quadratic_get_type(void);
  175|      2|	extern GType vips_affine_get_type(void);
  176|      2|	extern GType vips_similarity_get_type(void);
  177|      2|	extern GType vips_rotate_get_type(void);
  178|      2|	extern GType vips_resize_get_type(void);
  179|       |
  180|      2|	vips_thumbnail_file_get_type();
  181|      2|	vips_thumbnail_buffer_get_type();
  182|      2|	vips_thumbnail_image_get_type();
  183|      2|	vips_thumbnail_source_get_type();
  184|      2|	vips_mapim_get_type();
  185|      2|	vips_shrink_get_type();
  186|      2|	vips_shrinkh_get_type();
  187|      2|	vips_shrinkv_get_type();
  188|      2|	vips_reduceh_get_type();
  189|      2|	vips_reducev_get_type();
  190|      2|	vips_reduce_get_type();
  191|      2|	vips_quadratic_get_type();
  192|      2|	vips_affine_get_type();
  193|      2|	vips_similarity_get_type();
  194|      2|	vips_rotate_get_type();
  195|      2|	vips_resize_get_type();
  196|      2|}
resample.c:vips_resample_class_init:
  128|      1|{
  129|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  130|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  131|       |
  132|      1|	gobject_class->set_property = vips_object_set_property;
  133|      1|	gobject_class->get_property = vips_object_get_property;
  134|       |
  135|      1|	vobject_class->nickname = "resample";
  136|      1|	vobject_class->description = _("resample operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  137|      1|	vobject_class->build = vips_resample_build;
  138|       |
  139|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  140|      1|		_("Input"),
  141|      1|		_("Input image argument"),
  142|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  143|      1|		G_STRUCT_OFFSET(VipsResample, in));
  144|       |
  145|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  146|      1|		_("Output"),
  147|      1|		_("Output image"),
  148|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  149|      1|		G_STRUCT_OFFSET(VipsResample, out));
  150|      1|}

resize.c:vips_resize_class_init:
  312|      1|{
  313|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  314|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  315|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  316|       |
  317|      1|	VIPS_DEBUG_MSG("vips_resize_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  318|       |
  319|      1|	gobject_class->set_property = vips_object_set_property;
  320|      1|	gobject_class->get_property = vips_object_get_property;
  321|       |
  322|      1|	vobject_class->nickname = "resize";
  323|      1|	vobject_class->description = _("resize an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  324|      1|	vobject_class->build = vips_resize_build;
  325|       |
  326|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  327|       |
  328|      1|	VIPS_ARG_DOUBLE(class, "scale", 113,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  329|      1|		_("Scale factor"),
  330|      1|		_("Scale image by this factor"),
  331|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  332|      1|		G_STRUCT_OFFSET(VipsResize, scale),
  333|      1|		0.0, 10000000.0, 0.0);
  334|       |
  335|      1|	VIPS_ARG_DOUBLE(class, "vscale", 113,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  336|      1|		_("Vertical scale factor"),
  337|      1|		_("Vertical scale image by this factor"),
  338|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  339|      1|		G_STRUCT_OFFSET(VipsResize, vscale),
  340|      1|		0.0, 10000000.0, 0.0);
  341|       |
  342|      1|	VIPS_ARG_ENUM(class, "kernel", 3,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  343|      1|		_("Kernel"),
  344|      1|		_("Resampling kernel"),
  345|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  346|      1|		G_STRUCT_OFFSET(VipsResize, kernel),
  347|      1|		VIPS_TYPE_KERNEL, VIPS_KERNEL_LANCZOS3);
  348|       |
  349|      1|	VIPS_ARG_DOUBLE(class, "gap", 4,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  350|      1|		_("Gap"),
  351|      1|		_("Reducing gap"),
  352|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  353|      1|		G_STRUCT_OFFSET(VipsResize, gap),
  354|      1|		0.0, 1000000.0, 2.0);
  355|       |
  356|       |	/* We used to let people set the input offset so you could pick centre
  357|       |	 * or corner interpolation, but it's not clear this was useful.
  358|       |	 */
  359|      1|	VIPS_ARG_DOUBLE(class, "idx", 115,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  360|      1|		_("Input offset"),
  361|      1|		_("Horizontal input displacement"),
  362|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  363|      1|		G_STRUCT_OFFSET(VipsResize, idx),
  364|      1|		-10000000.0, 10000000.0, 0.0);
  365|       |
  366|      1|	VIPS_ARG_DOUBLE(class, "idy", 116,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  367|      1|		_("Input offset"),
  368|      1|		_("Vertical input displacement"),
  369|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  370|      1|		G_STRUCT_OFFSET(VipsResize, idy),
  371|      1|		-10000000.0, 10000000.0, 0.0);
  372|       |
  373|       |	/* It's a kernel now we use vips_reduce() not vips_affine().
  374|       |	 */
  375|      1|	VIPS_ARG_INTERPOLATE(class, "interpolate", 2,
  ------------------
  |  |  138|      1|	VIPS_ARG_OBJECT(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET, VIPS_TYPE_INTERPOLATE)
  |  |  ------------------
  |  |  |  |  125|      1|	{ \
  |  |  |  |  126|      1|		GParamSpec *pspec; \
  |  |  |  |  127|      1|\
  |  |  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  |  |  129|      1|			TYPE, \
  |  |  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  |  |  135|      1|	}
  |  |  ------------------
  ------------------
  376|      1|		_("Interpolate"),
  377|      1|		_("Interpolate pixels with this"),
  378|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  379|      1|		G_STRUCT_OFFSET(VipsResize, interpolate));
  380|       |
  381|       |	/* We used to let people pick centre or corner, but it's automatic now.
  382|       |	 */
  383|      1|	VIPS_ARG_BOOL(class, "centre", 7,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  384|      1|		_("Centre"),
  385|      1|		_("Use centre sampling convention"),
  386|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
  387|      1|		G_STRUCT_OFFSET(VipsResize, centre),
  388|      1|		FALSE);
  389|      1|}

shrink.c:vips_shrink_class_init:
  122|      1|{
  123|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  124|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  125|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  126|       |
  127|      1|	VIPS_DEBUG_MSG("vips_shrink_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  128|       |
  129|      1|	gobject_class->set_property = vips_object_set_property;
  130|      1|	gobject_class->get_property = vips_object_get_property;
  131|       |
  132|      1|	vobject_class->nickname = "shrink";
  133|      1|	vobject_class->description = _("shrink an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  134|      1|	vobject_class->build = vips_shrink_build;
  135|       |
  136|       |	/* You'd think UNBUFFERED would work, but we will use reduce for non-int
  137|       |	 * shrinks, so it has to be straight SEQ.
  138|       |	 */
  139|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  140|       |
  141|      1|	VIPS_ARG_DOUBLE(class, "vshrink", 9,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  142|      1|		_("Vshrink"),
  143|      1|		_("Vertical shrink factor"),
  144|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  145|      1|		G_STRUCT_OFFSET(VipsShrink, vshrink),
  146|      1|		1.0, 1000000.0, 1.0);
  147|       |
  148|      1|	VIPS_ARG_DOUBLE(class, "hshrink", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  149|      1|		_("Hshrink"),
  150|      1|		_("Horizontal shrink factor"),
  151|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  152|      1|		G_STRUCT_OFFSET(VipsShrink, hshrink),
  153|      1|		1.0, 1000000.0, 1.0);
  154|       |
  155|      1|	VIPS_ARG_BOOL(class, "ceil", 10,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  156|      1|		_("Ceil"),
  157|      1|		_("Round-up output dimensions"),
  158|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  159|      1|		G_STRUCT_OFFSET(VipsShrink, ceil),
  160|      1|		FALSE);
  161|       |
  162|       |	/* The old names .. now use h and v everywhere.
  163|       |	 */
  164|      1|	VIPS_ARG_DOUBLE(class, "xshrink", 8,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  165|      1|		_("Xshrink"),
  166|      1|		_("Horizontal shrink factor"),
  167|      1|		VIPS_ARGUMENT_REQUIRED_INPUT | VIPS_ARGUMENT_DEPRECATED,
  168|      1|		G_STRUCT_OFFSET(VipsShrink, hshrink),
  169|      1|		1.0, 1000000.0, 1.0);
  170|       |
  171|      1|	VIPS_ARG_DOUBLE(class, "yshrink", 9,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  172|      1|		_("Yshrink"),
  173|      1|		_("Vertical shrink factor"),
  174|      1|		VIPS_ARGUMENT_REQUIRED_INPUT | VIPS_ARGUMENT_DEPRECATED,
  175|      1|		G_STRUCT_OFFSET(VipsShrink, vshrink),
  176|      1|		1.0, 1000000.0, 1.0);
  177|      1|}

shrinkh.c:vips_shrinkh_class_init:
  336|      1|{
  337|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  338|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  339|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  340|       |
  341|      1|	VIPS_DEBUG_MSG("vips_shrinkh_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  342|       |
  343|      1|	gobject_class->set_property = vips_object_set_property;
  344|      1|	gobject_class->get_property = vips_object_get_property;
  345|       |
  346|      1|	vobject_class->nickname = "shrinkh";
  347|      1|	vobject_class->description = _("shrink an image horizontally");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  348|      1|	vobject_class->build = vips_shrinkh_build;
  349|       |
  350|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  351|       |
  352|      1|	VIPS_ARG_INT(class, "hshrink", 8,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  353|      1|		_("Hshrink"),
  354|      1|		_("Horizontal shrink factor"),
  355|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  356|      1|		G_STRUCT_OFFSET(VipsShrinkh, hshrink),
  357|      1|		1, 1000000, 1);
  358|       |
  359|      1|	VIPS_ARG_BOOL(class, "ceil", 10,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  360|      1|		_("Ceil"),
  361|      1|		_("Round-up output dimensions"),
  362|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  363|      1|		G_STRUCT_OFFSET(VipsShrinkh, ceil),
  364|      1|		FALSE);
  365|       |
  366|       |	/* The old name .. now use h and v everywhere.
  367|       |	 */
  368|      1|	VIPS_ARG_INT(class, "xshrink", 8,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  369|      1|		_("Xshrink"),
  370|      1|		_("Horizontal shrink factor"),
  371|      1|		VIPS_ARGUMENT_REQUIRED_INPUT | VIPS_ARGUMENT_DEPRECATED,
  372|      1|		G_STRUCT_OFFSET(VipsShrinkh, hshrink),
  373|      1|		1, 1000000, 1);
  374|      1|}

shrinkv.c:vips_shrinkv_class_init:
  410|      1|{
  411|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  412|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  413|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  414|       |
  415|      1|	VIPS_DEBUG_MSG("vips_shrinkv_class_init\n");
  ------------------
  |  |   47|      1|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|      1|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|      1|	{ \
  |  |   49|      1|		; \
  |  |   50|      1|	} \
  |  |   51|      1|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|      1|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  416|       |
  417|      1|	gobject_class->set_property = vips_object_set_property;
  418|      1|	gobject_class->get_property = vips_object_get_property;
  419|       |
  420|      1|	vobject_class->nickname = "shrinkv";
  421|      1|	vobject_class->description = _("shrink an image vertically");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  422|      1|	vobject_class->build = vips_shrinkv_build;
  423|       |
  424|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  425|       |
  426|      1|	VIPS_ARG_INT(class, "vshrink", 9,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  427|      1|		_("Vshrink"),
  428|      1|		_("Vertical shrink factor"),
  429|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  430|      1|		G_STRUCT_OFFSET(VipsShrinkv, vshrink),
  431|      1|		1, 1000000, 1);
  432|       |
  433|      1|	VIPS_ARG_BOOL(class, "ceil", 10,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  434|      1|		_("Ceil"),
  435|      1|		_("Round-up output dimensions"),
  436|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  437|      1|		G_STRUCT_OFFSET(VipsShrinkv, ceil),
  438|      1|		FALSE);
  439|       |
  440|       |	/* The old name .. now use h and v everywhere.
  441|       |	 */
  442|      1|	VIPS_ARG_INT(class, "yshrink", 8,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  443|      1|		_("Yshrink"),
  444|      1|		_("Vertical shrink factor"),
  445|      1|		VIPS_ARGUMENT_REQUIRED_INPUT | VIPS_ARGUMENT_DEPRECATED,
  446|      1|		G_STRUCT_OFFSET(VipsShrinkv, vshrink),
  447|      1|		1, 1000000, 1);
  448|      1|}

similarity.c:vips_similarity_base_class_init:
  115|      1|{
  116|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  117|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  118|       |
  119|      1|	gobject_class->set_property = vips_object_set_property;
  120|      1|	gobject_class->get_property = vips_object_get_property;
  121|       |
  122|      1|	vobject_class->nickname = "similarity_base";
  123|      1|	vobject_class->description = _("base similarity transform");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  124|      1|	vobject_class->build = vips_similarity_base_build;
  125|       |
  126|      1|	VIPS_ARG_INTERPOLATE(class, "interpolate", 5,
  ------------------
  |  |  138|      1|	VIPS_ARG_OBJECT(CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET, VIPS_TYPE_INTERPOLATE)
  |  |  ------------------
  |  |  |  |  125|      1|	{ \
  |  |  |  |  126|      1|		GParamSpec *pspec; \
  |  |  |  |  127|      1|\
  |  |  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  |  |  129|      1|			TYPE, \
  |  |  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  |  |  ------------------
  |  |  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  |  |  135|      1|	}
  |  |  ------------------
  ------------------
  127|      1|		_("Interpolate"),
  128|      1|		_("Interpolate pixels with this"),
  129|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  130|      1|		G_STRUCT_OFFSET(VipsSimilarityBase, interpolate));
  131|       |
  132|      1|	VIPS_ARG_BOXED(class, "background", 6,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
  133|      1|		_("Background"),
  134|      1|		_("Background value"),
  135|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  136|      1|		G_STRUCT_OFFSET(VipsSimilarityBase, background),
  137|      1|		VIPS_TYPE_ARRAY_DOUBLE);
  138|       |
  139|      1|	VIPS_ARG_DOUBLE(class, "odx", 112,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  140|      1|		_("Output offset"),
  141|      1|		_("Horizontal output displacement"),
  142|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  143|      1|		G_STRUCT_OFFSET(VipsSimilarityBase, odx),
  144|      1|		-10000000, 10000000, 0);
  145|       |
  146|      1|	VIPS_ARG_DOUBLE(class, "ody", 113,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  147|      1|		_("Output offset"),
  148|      1|		_("Vertical output displacement"),
  149|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  150|      1|		G_STRUCT_OFFSET(VipsSimilarityBase, ody),
  151|      1|		-10000000, 10000000, 0);
  152|       |
  153|      1|	VIPS_ARG_DOUBLE(class, "idx", 114,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  154|      1|		_("Input offset"),
  155|      1|		_("Horizontal input displacement"),
  156|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  157|      1|		G_STRUCT_OFFSET(VipsSimilarityBase, idx),
  158|      1|		-10000000, 10000000, 0);
  159|       |
  160|      1|	VIPS_ARG_DOUBLE(class, "idy", 115,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  161|      1|		_("Input offset"),
  162|      1|		_("Vertical input displacement"),
  163|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  164|      1|		G_STRUCT_OFFSET(VipsSimilarityBase, idy),
  165|      1|		-10000000, 10000000, 0);
  166|      1|}
similarity.c:vips_similarity_class_init:
  189|      1|{
  190|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  191|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|       |
  193|      1|	gobject_class->set_property = vips_object_set_property;
  194|      1|	gobject_class->get_property = vips_object_get_property;
  195|       |
  196|      1|	vobject_class->nickname = "similarity";
  197|      1|	vobject_class->description = _("similarity transform of an image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  198|       |
  199|      1|	VIPS_ARG_DOUBLE(class, "scale", 3,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  200|      1|		_("Scale"),
  201|      1|		_("Scale by this factor"),
  202|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  203|      1|		G_STRUCT_OFFSET(VipsSimilarity, scale),
  204|      1|		0, 10000000, 1);
  205|       |
  206|      1|	VIPS_ARG_DOUBLE(class, "angle", 4,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  207|      1|		_("Angle"),
  208|      1|		_("Rotate clockwise by this many degrees"),
  209|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  210|      1|		G_STRUCT_OFFSET(VipsSimilarity, angle),
  211|      1|		-10000000, 10000000, 0);
  212|      1|}
similarity.c:vips_rotate_class_init:
  264|      1|{
  265|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  266|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|       |
  268|      1|	gobject_class->set_property = vips_object_set_property;
  269|      1|	gobject_class->get_property = vips_object_get_property;
  270|       |
  271|      1|	vobject_class->nickname = "rotate";
  272|      1|	vobject_class->description =
  273|      1|		_("rotate an image by a number of degrees");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  274|       |
  275|      1|	VIPS_ARG_DOUBLE(class, "angle", 4,
  ------------------
  |  |  156|      1|	{ \
  |  |  157|      1|		GParamSpec *pspec; \
  |  |  158|      1|\
  |  |  159|      1|		pspec = g_param_spec_double((NAME), (LONG), (DESC), \
  |  |  160|      1|			(MIN), (MAX), (VALUE), \
  |  |  161|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  162|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      1|			vips_argument_get_id(), pspec); \
  |  |  164|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  166|      1|	}
  ------------------
  276|      1|		_("Angle"),
  277|      1|		_("Rotate clockwise by this many degrees"),
  278|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  279|      1|		G_STRUCT_OFFSET(VipsSimilarity, angle),
  280|      1|		-10000000, 10000000, 0);
  281|      1|}

bicubic.cpp:_ZL30calculate_coefficients_catmullPdd:
  292|     65|{
  293|       |	/* Nicolas believes that the following is an hitherto unknown
  294|       |	 * hyper-efficient method of computing Catmull-Rom coefficients. It
  295|       |	 * only uses 4* & 1+ & 5- for a total of only 10 flops to compute
  296|       |	 * four coefficients.
  297|       |	 */
  298|     65|	const double cr1 = 1. - x;
  299|     65|	const double cr2 = -.5 * x;
  300|     65|	const double cr3 = cr1 * cr2;
  301|     65|	const double cone = cr1 * cr3;
  302|     65|	const double cfou = x * cr3;
  303|     65|	const double cr4 = cfou - cone;
  304|     65|	const double ctwo = cr1 - cone + cr4;
  305|     65|	const double cthr = x - cfou - cr4;
  306|       |
  307|     65|	g_assert(x >= 0. && x <= 1.);
  ------------------
  |  |  166|     65|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|     65|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     65|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  308|       |
  309|     65|	c[0] = cone;
  310|     65|	c[3] = cfou;
  311|     65|	c[1] = ctwo;
  312|     65|	c[2] = cthr;
  313|     65|}

thumbnail.c:vips_thumbnail_class_init:
  948|      1|{
  949|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  950|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  951|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  952|       |
  953|      1|	gobject_class->dispose = vips_thumbnail_dispose;
  954|      1|	gobject_class->finalize = vips_thumbnail_finalize;
  955|      1|	gobject_class->set_property = vips_object_set_property;
  956|      1|	gobject_class->get_property = vips_object_get_property;
  957|       |
  958|      1|	vobject_class->nickname = "thumbnail_base";
  959|      1|	vobject_class->description = _("thumbnail generation");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  960|      1|	vobject_class->build = vips_thumbnail_build;
  961|       |
  962|       |	/* We mustn't cache these calls, since we open the file or buffer in
  963|       |	 * sequential mode.
  964|       |	 */
  965|      1|	operation_class->flags |= VIPS_OPERATION_NOCACHE;
  966|       |
  967|      1|	VIPS_ARG_IMAGE(class, "out", 2,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  968|      1|		_("Output"),
  969|      1|		_("Output image"),
  970|      1|		VIPS_ARGUMENT_REQUIRED_OUTPUT,
  971|      1|		G_STRUCT_OFFSET(VipsThumbnail, out));
  972|       |
  973|      1|	VIPS_ARG_INT(class, "width", 3,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  974|      1|		_("Target width"),
  975|      1|		_("Size to this width"),
  976|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  977|      1|		G_STRUCT_OFFSET(VipsThumbnail, width),
  978|      1|		1, VIPS_MAX_COORD, 1);
  979|       |
  980|      1|	VIPS_ARG_INT(class, "height", 113,
  ------------------
  |  |  184|      1|	{ \
  |  |  185|      1|		GParamSpec *pspec; \
  |  |  186|      1|\
  |  |  187|      1|		pspec = g_param_spec_int((NAME), (LONG), (DESC), \
  |  |  188|      1|			(MIN), (MAX), (VALUE), \
  |  |  189|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  190|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  191|      1|			vips_argument_get_id(), pspec); \
  |  |  192|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  194|      1|	}
  ------------------
  981|      1|		_("Target height"),
  982|      1|		_("Size to this height"),
  983|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  984|      1|		G_STRUCT_OFFSET(VipsThumbnail, height),
  985|      1|		1, VIPS_MAX_COORD, 1);
  986|       |
  987|      1|	VIPS_ARG_ENUM(class, "size", 114,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
  988|      1|		_("Size"),
  989|      1|		_("Only upsize, only downsize, or both"),
  990|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  991|      1|		G_STRUCT_OFFSET(VipsThumbnail, size),
  992|      1|		VIPS_TYPE_SIZE, VIPS_SIZE_BOTH);
  993|       |
  994|      1|	VIPS_ARG_BOOL(class, "no_rotate", 115,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
  995|      1|		_("No rotate"),
  996|      1|		_("Don't use orientation tags to rotate image upright"),
  997|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
  998|      1|		G_STRUCT_OFFSET(VipsThumbnail, no_rotate),
  999|      1|		FALSE);
 1000|       |
 1001|      1|	VIPS_ARG_ENUM(class, "crop", 116,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
 1002|      1|		_("Crop"),
 1003|      1|		_("Reduce to fill target rectangle, then crop"),
 1004|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1005|      1|		G_STRUCT_OFFSET(VipsThumbnail, crop),
 1006|      1|		VIPS_TYPE_INTERESTING, VIPS_INTERESTING_NONE);
 1007|       |
 1008|      1|	VIPS_ARG_BOOL(class, "linear", 117,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1009|      1|		_("Linear"),
 1010|      1|		_("Reduce in linear light"),
 1011|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1012|      1|		G_STRUCT_OFFSET(VipsThumbnail, linear),
 1013|      1|		FALSE);
 1014|       |
 1015|      1|	VIPS_ARG_STRING(class, "import_profile", 118,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1016|      1|		_("Import profile"),
 1017|      1|		_("Fallback import profile"),
 1018|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1019|      1|		G_STRUCT_OFFSET(VipsThumbnail, import_profile),
 1020|      1|		NULL);
 1021|       |
 1022|      1|	VIPS_ARG_STRING(class, "export_profile", 119,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1023|      1|		_("Export profile"),
 1024|      1|		_("Fallback export profile"),
 1025|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1026|      1|		G_STRUCT_OFFSET(VipsThumbnail, export_profile),
 1027|      1|		NULL);
 1028|       |
 1029|      1|	VIPS_ARG_ENUM(class, "intent", 120,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
 1030|      1|		_("Intent"),
 1031|      1|		_("Rendering intent"),
 1032|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1033|      1|		G_STRUCT_OFFSET(VipsThumbnail, intent),
 1034|      1|		VIPS_TYPE_INTENT, VIPS_INTENT_RELATIVE);
 1035|       |
 1036|      1|	VIPS_ARG_ENUM(class, "fail_on", 121,
  ------------------
  |  |  212|      1|	{ \
  |  |  213|      1|		GParamSpec *pspec; \
  |  |  214|      1|\
  |  |  215|      1|		pspec = g_param_spec_enum((NAME), (LONG), (DESC), \
  |  |  216|      1|			(TYPE), (VALUE), \
  |  |  217|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  218|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      1|			vips_argument_get_id(), pspec); \
  |  |  220|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  221|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  222|      1|	}
  ------------------
 1037|      1|		_("Fail on"),
 1038|      1|		_("Error level to fail on"),
 1039|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1040|      1|		G_STRUCT_OFFSET(VipsThumbnail, fail_on),
 1041|      1|		VIPS_TYPE_FAIL_ON, VIPS_FAIL_ON_NONE);
 1042|       |
 1043|       |	/* BOOL args which default TRUE arguments don't work with the
 1044|       |	 * command-line -- GOption does not allow --auto-rotate=false.
 1045|       |	 *
 1046|       |	 * This is now replaced (though still functional) with "no-rotate",
 1047|       |	 * see above.
 1048|       |	 */
 1049|      1|	VIPS_ARG_BOOL(class, "auto_rotate", 121,
  ------------------
  |  |  142|      1|	{ \
  |  |  143|      1|		GParamSpec *pspec; \
  |  |  144|      1|\
  |  |  145|      1|		pspec = g_param_spec_boolean((NAME), (LONG), (DESC), \
  |  |  146|      1|			(VALUE), \
  |  |  147|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  148|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|      1|			vips_argument_get_id(), pspec); \
  |  |  150|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  152|      1|	}
  ------------------
 1050|      1|		_("Auto rotate"),
 1051|      1|		_("Use orientation tags to rotate image upright"),
 1052|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
 1053|      1|		G_STRUCT_OFFSET(VipsThumbnail, auto_rotate),
 1054|      1|		TRUE);
 1055|      1|}
thumbnail.c:vips_thumbnail_file_class_init:
 1183|      1|{
 1184|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1185|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1186|      1|	VipsThumbnailClass *thumbnail_class = VIPS_THUMBNAIL_CLASS(class);
  ------------------
  |  |   93|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   94|      1|		VIPS_TYPE_THUMBNAIL, VipsThumbnailClass))
  ------------------
 1187|       |
 1188|      1|	gobject_class->set_property = vips_object_set_property;
 1189|      1|	gobject_class->get_property = vips_object_get_property;
 1190|       |
 1191|      1|	vobject_class->nickname = "thumbnail";
 1192|      1|	vobject_class->description = _("generate thumbnail from file");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1193|       |
 1194|      1|	thumbnail_class->get_info = vips_thumbnail_file_get_info;
 1195|      1|	thumbnail_class->open = vips_thumbnail_file_open;
 1196|       |
 1197|      1|	VIPS_ARG_STRING(class, "filename", 1,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1198|      1|		_("Filename"),
 1199|      1|		_("Filename to read from"),
 1200|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1201|      1|		G_STRUCT_OFFSET(VipsThumbnailFile, filename),
 1202|      1|		NULL);
 1203|      1|}
thumbnail.c:vips_thumbnail_buffer_class_init:
 1430|      1|{
 1431|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1432|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1433|      1|	VipsThumbnailClass *thumbnail_class = VIPS_THUMBNAIL_CLASS(class);
  ------------------
  |  |   93|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   94|      1|		VIPS_TYPE_THUMBNAIL, VipsThumbnailClass))
  ------------------
 1434|       |
 1435|      1|	gobject_class->set_property = vips_object_set_property;
 1436|      1|	gobject_class->get_property = vips_object_get_property;
 1437|       |
 1438|      1|	vobject_class->nickname = "thumbnail_buffer";
 1439|      1|	vobject_class->description = _("generate thumbnail from buffer");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1440|       |
 1441|      1|	thumbnail_class->get_info = vips_thumbnail_buffer_get_info;
 1442|      1|	thumbnail_class->open = vips_thumbnail_buffer_open;
 1443|       |
 1444|      1|	VIPS_ARG_BOXED(class, "buffer", 1,
  ------------------
  |  |  170|      1|	{ \
  |  |  171|      1|		GParamSpec *pspec; \
  |  |  172|      1|\
  |  |  173|      1|		pspec = g_param_spec_boxed((NAME), (LONG), (DESC), \
  |  |  174|      1|			(TYPE), \
  |  |  175|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  176|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      1|			vips_argument_get_id(), pspec); \
  |  |  178|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  180|      1|	}
  ------------------
 1445|      1|		_("Buffer"),
 1446|      1|		_("Buffer to load from"),
 1447|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1448|      1|		G_STRUCT_OFFSET(VipsThumbnailBuffer, buf),
 1449|      1|		VIPS_TYPE_BLOB);
 1450|       |
 1451|      1|	VIPS_ARG_STRING(class, "option_string", 20,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1452|      1|		_("Extra options"),
 1453|      1|		_("Options that are passed on to the underlying loader"),
 1454|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1455|      1|		G_STRUCT_OFFSET(VipsThumbnailBuffer, option_string),
 1456|      1|		"");
 1457|      1|}
thumbnail.c:vips_thumbnail_source_class_init:
 1643|      1|{
 1644|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1645|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1646|      1|	VipsThumbnailClass *thumbnail_class = VIPS_THUMBNAIL_CLASS(class);
  ------------------
  |  |   93|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   94|      1|		VIPS_TYPE_THUMBNAIL, VipsThumbnailClass))
  ------------------
 1647|       |
 1648|      1|	gobject_class->set_property = vips_object_set_property;
 1649|      1|	gobject_class->get_property = vips_object_get_property;
 1650|       |
 1651|      1|	vobject_class->nickname = "thumbnail_source";
 1652|      1|	vobject_class->description = _("generate thumbnail from source");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1653|       |
 1654|      1|	thumbnail_class->get_info = vips_thumbnail_source_get_info;
 1655|      1|	thumbnail_class->open = vips_thumbnail_source_open;
 1656|       |
 1657|      1|	VIPS_ARG_OBJECT(class, "source", 1,
  ------------------
  |  |  125|      1|	{ \
  |  |  126|      1|		GParamSpec *pspec; \
  |  |  127|      1|\
  |  |  128|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  129|      1|			TYPE, \
  |  |  130|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  131|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      1|			vips_argument_get_id(), pspec); \
  |  |  133|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  135|      1|	}
  ------------------
 1658|      1|		_("Source"),
 1659|      1|		_("Source to load from"),
 1660|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1661|      1|		G_STRUCT_OFFSET(VipsThumbnailSource, source),
 1662|      1|		VIPS_TYPE_SOURCE);
 1663|       |
 1664|      1|	VIPS_ARG_STRING(class, "option_string", 20,
  ------------------
  |  |  240|      1|	{ \
  |  |  241|      1|		GParamSpec *pspec; \
  |  |  242|      1|\
  |  |  243|      1|		pspec = g_param_spec_string((NAME), (LONG), (DESC), \
  |  |  244|      1|			(VALUE), \
  |  |  245|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  246|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      1|			vips_argument_get_id(), pspec); \
  |  |  248|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  250|      1|	}
  ------------------
 1665|      1|		_("Extra options"),
 1666|      1|		_("Options that are passed on to the underlying loader"),
 1667|      1|		VIPS_ARGUMENT_OPTIONAL_INPUT,
 1668|      1|		G_STRUCT_OFFSET(VipsThumbnailSource, option_string),
 1669|      1|		"");
 1670|      1|}
thumbnail.c:vips_thumbnail_image_class_init:
 1767|      1|{
 1768|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1769|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1770|      1|	VipsThumbnailClass *thumbnail_class = VIPS_THUMBNAIL_CLASS(class);
  ------------------
  |  |   93|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   94|      1|		VIPS_TYPE_THUMBNAIL, VipsThumbnailClass))
  ------------------
 1771|       |
 1772|      1|	gobject_class->set_property = vips_object_set_property;
 1773|      1|	gobject_class->get_property = vips_object_get_property;
 1774|       |
 1775|      1|	vobject_class->nickname = "thumbnail_image";
 1776|      1|	vobject_class->description = _("generate thumbnail from image");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1777|       |
 1778|      1|	thumbnail_class->get_info = vips_thumbnail_image_get_info;
 1779|      1|	thumbnail_class->open = vips_thumbnail_image_open;
 1780|       |
 1781|      1|	VIPS_ARG_IMAGE(class, "in", 1,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
 1782|      1|		_("Input"),
 1783|      1|		_("Input image argument"),
 1784|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
 1785|      1|		G_STRUCT_OFFSET(VipsThumbnailImage, in));
 1786|      1|}

vsqbs.cpp:_ZL33vips_interpolate_vsqbs_class_initP26_VipsInterpolateVsqbsClass:
  373|      1|{
  374|      1|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(klass);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  375|      1|	VipsInterpolateClass *interpolate_class = VIPS_INTERPOLATE_CLASS(klass);
  ------------------
  |  |   50|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      1|		VIPS_TYPE_INTERPOLATE, VipsInterpolateClass))
  ------------------
  376|       |
  377|      1|	object_class->nickname = "vsqbs";
  378|      1|	object_class->description = _("B-Splines with antialiasing smoothing");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  379|       |
  380|      1|	interpolate_class->interpolate = vips_interpolate_vsqbs_interpolate;
  381|      1|	interpolate_class->window_size = 4;
  382|      1|	interpolate_class->window_offset = 1;
  383|      1|}

